首页 > 其他分享 >双重检测代码为什么有线程安全问题

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

时间:2023-01-20 10:35:13浏览次数:32  
标签:Singleton 代码 双重 instance 实例 线程 new volatile null

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关键字防止重排序

标签:Singleton,代码,双重,instance,实例,线程,new,volatile,null
From: https://www.cnblogs.com/dujl/p/17062483.html

相关文章