当多个线程操作共享数据时,彼此不可见是一个问题;
可以使用volatile 关键字:当多个线程调用共享数据时,可以保证内存中的数据可见;效率比锁高;
相较于synchronized 是一种较为轻量级的同步策略;
注意:
1. synchronized具有互斥性,而volatile不具备;互斥性:当一个线程作用于一个对象是,另外一个线程进不来;线程互相排斥;
2. 不能保证变量的"原子性";
当程序运行时,JVM为每个线程提供一个独立的缓存提高效率;
JVM底层会对内存进行重排序,但是使用volatile关键字后,不会进行重排序;性能会有所下降;
public static void main(String[] args) {
ThreadDemo demo = new ThreadDemo();
new Thread(demo).start();
while(true){
// synchronized(demo){
if(demo.isFlag()){
System.out.println("-----------");
break;
}
// }
}
}
class ThreadDemo implements Runnable{
private volatile boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
System.out.println("flag="+isFlag());
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}