public class Singleton {
// 添加关键词
private volatile static Singleton instance;
public Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
以上代码看似完美 ,但是忽略了一个问题就是new对象并不是有序操作
正常过程如下:
- 分配内存空间
- 初始化Singleton实例
- 赋值 instance 实例引用
但是被重排序以后可能会出现:
- 分配内存空间
- 赋值 instance 实例引用
- 初始化Singleton实例
此时可以加上一个volatile关键字防止重排序
标签:Singleton,代码,双重,instance,实例,线程,new,volatile,null From: https://www.cnblogs.com/dujl/p/17062483.html