双重检测代码为什么有线程安全问题

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对象并不是有序操作

正常过程如下:

  1. 分配内存空间
  2. 初始化Singleton实例
  3. 赋值 instance 实例引用

但是被重排序以后可能会出现:

  1. 分配内存空间
  2. 赋值 instance 实例引用
  3. 初始化Singleton实例

 

此时可以加上一个volatile关键字防止重排序

posted @ 2023-01-20 10:23  京木木  阅读(33)  评论(0)    收藏  举报