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();
}
}
}
当程序运行后,一直处于循环,说明此刻在mian线程中拿到的值 和threadA中的值不一样。
这个flag其实存在三个值
主内存,main内存中的值,threadA中值,当执行while(true)时,因为执行效率太高,没空去主内存同步数据,导致程序一直死循环。
解决方案有两个
1:
synchronize(ThreadA.class ){
if (threadA.isFlag()) {
System.out.println("main --------------------");
break;
}
}
用synchronize关键词锁起来 达到同步的效果,确定效率太低,太重量级。
2:flag 属性加入 volatile 关键词
使用volatile也可以起到同步的作用,效率更高,比synchronize轻量级
使用volatile就一定线程安全吗?
详见