关于volitale关键字
volitale即是挥发物,被该关键字修饰变量的值发生改变时,会导致该变量的CPU缓存失效,必须CPU需要重新去内存拉取最新的值。
该关键字保证了变量的可见性(用一句术语:对于变量的写入操作总是happens-before每一个后续的对该变量的读写操作,也就是保证了更新后的变量,后续的程序总能看到),即该变量发生改变时,在改时间点之后执行的代码可以立即看到变化。
volitale在jdk中一般的应用场景常常与 for死循环一起出现,表示在volitale变量达到某个条件时进行CAS操作。
详细实现原理请参考:http://ifeve.com/volatile/
因此可以利用volitale关键字的可见性来实现绝对安全的单例,代码如下所示:
/**
* 使用volatile优雅地实现单例
* Created by dingxiangyong on 2016/5/3.
*/
public class Singleton {
//单例
private static volatile Singleton instance = null;
private Singleton(){
}
/**
* get instance
* @return
*/
public static Singleton getInstance(){
if (instance == null){
synchronized (Singleton.class){
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}