java volitile关键字
转自 https://www.cnblogs.com/dolphin0520/p/3920373.html
//线程1 boolean stop = false; while(!stop){ doSomething(); } //线程2 stop = true;
第一:使用volatile关键字会强制将修改的值立即写入主存;
第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);
第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。
volatile无法保证原子性,只能保证一定程度的有序性
通常来说,使用volatile必须具备以下2个条件:
1)对变量的写操作不依赖于当前值
2)该变量没有包含在具有其他变量的不变式中
使用场景,参见 https://www.cnblogs.com/ouyxy/p/7242563.html
1.状态标记量
volatile boolean inited = false; //线程1: context = loadContext(); inited = true; //线程2: while(!inited ){ sleep() } doSomethingwithconfig(context);
2.double check
private volatile static Singleton instace; public static Singleton getInstance(){ //第一次null检查 if(instance == null){ synchronized(Singleton.class) { //1 //第二次null检查 if(instance == null){ //2 instance = new Singleton();//3 } } } return instance; }
确保只有在创建的时候才会有同步化的操作,在使用的时候避免同步锁,节省不必要的开销
《Java 中的双重检查(Double-Check)》https://www.cnblogs.com/zxf330301/p/6006750.html