内存屏蔽
在某些情况下多个线程共享的数据段,会出现内存屏蔽,即其中一个线程已经对该共享数据做了修改,可其他线程却一直没有进行数据更新(比如在使用while(true){}循环时,由于此结构调用了较为底层的代码,执行效率极高,以至于没有更新数据段的机会)
看个栗子
1 | package juc; |
1 | package juc; |
输出结果如下
解决方法
同步锁(效率很低)
1
2
3
4
5
6
7
8
9while(true){
synchronized (td){//可以保证数据的一个及时更新
if(td.isFlag()){
System.out.println("-------------");
//此段代码现在可以被执行
break;
}
}
}使用volatile关键字,当多个线程操作共享数据时,可以保证内存中的数据可见,为实例域的同步访问提供了一种免锁机制
1
private volatile boolean flag=false;
不过要注意的是,volatile不具备“操作互斥性”,且不提供原子操作