彻底搞懂双重检查单例模式
2018-10-02 本文已影响16人
编程界的小学生
一、源码
public class SingletonExample4 {
private volatile static SingletonExample4 instance = null;
private SingletonExample4() {}
public static SingletonExample4 getInstance() {
if (instance == null) {
synchronized (SingletonExample4.class) {
if (instance == null) {
instance = new SingletonExample4();
}
}
}
return instance;
}
}
二、为什么需要加volatile才可以?
因为:
1、先说下new Object()在底层是几步骤
- 1.memory=allocate()分配对象的内存空间。
- 2.createInstance()初始化对象
- 3.instance=memory 设置instance指向刚分配的内存
2、再说下为什么需要volatile
因为JVM指令重排序。
若3.和2.被重排序换位置了,那结果是先分配内存空间,然后指向,最后初始化对象。那么我们这时候虽然是有synchronize,但是两次进入都发现没有初始化对象,因为他指向内存分配的空间了,尚未初始化对象。
三、广告
-
码云地址
-
QQ群【Java初学者学习交流群】:458430385
-
微信公众号【Java码农社区】
img -
今日头条号:编程界的小学生