单例模式
单例模式DCL(双端检锁机制)
示例代码:
public class SingleDclDemo {
public static SingleDclDemo instance =null;
private SingleDclDemo(){
System.out.println("我是构造方法");
}
public static SingleDclDemo getInstance(){
if(instance ==null){
synchronized (SingleDclDemo.class){
if(instance ==null) {
instance = new SingleDclDemo();
}
}
}
return instance;
}
public static void main(String[] args) {
// for (int i = 0; i < 3; i++) {
// System.out.println(getInstance() == getInstance() );
// }
for (int j = 0; j < 10; j++) {
new Thread(()->{
System.out.println(getInstance() == getInstance() );
}).start();
}
}
}
DCL模式线程不安全
DCL机制不一定线程安全,因为有指令重排的存证
instance = new SingletomDemo();可以分为3步
memory = allocate(); 1:分配内存空间
instance(memory); 2:初始化对象
instance = memory; 3:设置instance指向刚分配的内存空间,instance !=null
由于2,3不存在依赖关系,所以2,3可能会被指令重排
调整成
memory = allocate(); 1:分配内存空间
instance = memory; 3:设置instance指向刚分配的内存空间,instance !=null
instance(memory); 2:初始化对象
这样就会导致instance 虽然不为null,但是取到后的值,却没有被初始化。
所以需要对instance加上volatile ,来禁止指令重排。