java - 关于线程安全设计中使用的逻辑的问题?
问题描述
下面是线程安全设计的代码片段。为什么我们要检查instance = null
同步块之前和内部?在外面检查还不够吗?
// double locking is used to reduce the overhead of the synchronized method
public static ThreadSafeSingleton getInstanceDoubleLocking() {
if (instance == null) {
synchronized (ThreadSafeSingleton.class) {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
}
}
return instance;
}
解决方案
它称为单例模式中的双重检查
让我们假设第一个线程进入方法检查实例是否为空,如果是,它将获取锁并开始创建对象。
假设当第一个线程仍在创建实例(可能是一个重的对象)时,同时另一个线程可能进入它检查实例是否为空的方法,因为第一个线程仍在创建资源并拥有锁,现在首先线程创建对象释放锁,第二个线程进入同步块并检查实例现在不为空条件失败并且它从方法中出来。因此仅在实例上存在。更多细节
https://www.java67.com/2015/09/thread-safe-singleton-in-java-using-double-checked-locking-pattern.html
推荐阅读
- registry - 获取“注册 COM+ 应用程序时出错”
- google-analytics - 手动生成的事件现在显示在分析中
- enterprise-architect - 在 Enterprise Architect 中禁用跟踪元素中的标记值
- cpu - CPU时钟可以提高我的程序的性能吗?
- python - 刽子手游戏查询
- java - 使用杰克逊转换时 POJO 有空值
- php - 如何使用 preg_split 拆分重复的字符和数字?
- reactjs - 在 React setState 中更新嵌套数组元素
- python - views.py Django中的1个函数中的多个渲染?
- reactjs - 我没有得到切换按钮组材料 ui 的值 onchange?