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

posted @ 2018-08-06 16:25  jiataoqin  阅读(246)  评论(0编辑  收藏  举报