线程安全问题
程序员文章站
2022-05-05 23:12:56
...
a++造成运行结果错误
原因分析:
首先我们有两个线程,在做i++的时候,看似是一条语句,实际上是三个步骤在执行。假设最开始 i 的值是1,理论估计在经过两个线程之后,i 的值应该为3。但是实际上结果是2,那么具体的流程是怎样的呢 ?第一个线程在拿到1之后把它加了,但是并没有立刻把它写进去,导致第二个线程在拿的时候,由于第一个线程的值虽然计算完毕了,但是没有告诉任何人,因此第二个线程拿到的还是1,于是呢它就把拿到的1再去加1。此时我们的线程又切回到1,这个时候线程1对于线程2 的内容是一概不知的,它就执行刚才未完的步骤,于是它就把2写回去了 ,而此时一旦切换到线程2,线程2也对与线程1的操作也是一概不知的,所以他也把2写回去。所以这就使得原本等于3的数字等于2。(结合上图理解)
实现死锁
package deadlock;
/**
* 描述: 必定发生死锁的情况
*/
public class MustDeadLock implements Runnable {
int flag = 1;
static Object o1 = new Object();
static Object o2 = new Object();
public static void main(String[] args) {
MustDeadLock r1 = new MustDeadLock();
MustDeadLock r2 = new MustDeadLock();
r1.flag = 1;
r2.flag = 0;
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
@Override
public void run() {
System.out.println("flag = " + flag);
if (flag == 1) {
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("线程1成功拿到两把锁");
}
}
}
if (flag == 0) {
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("线程2成功拿到两把锁");
}
}
}
}
}
上一篇: 线程安全问题