原子类AtomicInteger
public class TestVolatile {
public static void main(String[] args) {
ThreadA threadA = new ThreadA();
new Thread(threadA).start();
while (true){
if (threadA.isFlag()) {
System.out.println("main --------------------");
break;
}
}
}
}
class ThreadA implements Runnable {
private boolean flag = false;
public boolean isFlag() {
return flag;
}
@Override
public void run() {
try{
Thread.sleep(1000);
flag=true;
System.out.println("a flag="+flag);
}catch (Exception e){
e.printStackTrace();
}
}
}
用synchronize关键词锁起来 达到同步的效果,确定效率太低,太重量级。
使用volatile也可以起到同步的作用,效率更高,比synchronize轻量级,但volatile只能保证可见性,并不能让变量具备原子性。
根本原因是java的++操作并不是一个原子操作。
++操作其实是 先从内存取出值,然后对这个值+1。
当多个线程同时++就会出现数据错误的情况。
解决方案是代码做如下修改,使用原子类AtomicInteger