由于count++不是原子操作,多线程会有不安全问题。
flag不加volatile,有两种结果,一种是执行完,输出2000
一种是程序卡住了
flag加上volatile,结果一直是2000,(输出顺序可能有变化)
没有对count加上volatile,为什么线程安全了
java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockDemo {
private int count;
volatile int flag;
class LockThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
flag+=1;
System.out.println(flag);
}
}
public static void main(String[] args) {
LockDemo lockDemo=new LockDemo();
lockDemo.new LockThread().start();
lockDemo.new LockThread().start();
while (!(lockDemo.flag ==2)){}
System.out.println(lockDemo.count);
}
}
java
1
2
20000
我把你的代码复制试了下,并不总是1 2 20000的输出顺序,而且每次的count结果都不到20000。
所以肯定是你的几个线程变成顺序执行了。
我又在cpu只有一个核心的虚拟机上试了下,这回每次都是1 2 20000的结果。
所以可能是你的线程只循环1000次,太短了,在一个cpu时间片内就把任务完成了,导致每次看起来都是顺序执行。
我尝试将循环次数加大,直到循环10000000时,终于出现线程安全问题了。