volatile 的特性:
- 保证线程可见性, 具体查看 线程
- 禁止指令重排序
DCL单例
先来个手撸DCL单例:
/**
* DCL单例,双检锁
*/
public class DCLSingleton {
//自身维护私有静态实例,
private static DCLSingleton instance = null;
//public一个DCL获取实例的
public static DCLSingleton getInstance(){
//第一次检查
if ( instance == null ){
synchronized (DCLSingleton.class){
//第二次检查
if (instance == null){
instance = new DCLSingleton();
}
}
}
return instance;
}
//构造器私有
private DCLSingleton(){ }
}