java - 为什么不安全的双重检查锁定可以返回空值?
问题描述
有人告诉我不安全的双重检查锁定是不好的,因为它可能在某些竞争条件下返回 null,所以应该避免。
不安全的双重检查锁定习语:
public class UnsafeDCLFactory {
private Singleton instance;
public Singleton get() {
if (instance == null) { // read 1, check 1
synchronized (this) {
if (instance == null) { // read 2, check 2
instance = new Singleton();
}
}
}
return instance; // read 3
}
static class Singleton {
private Date d;
public Singleton() {
this.d = new Date();
}
}
}
当我们调用 get()
方法时,可能会返回 null,尽管这种情况非常罕见。但我只是想知道为什么可以返回 null ?这是否意味着即使'read 1'读取了一个非空值,'read3'仍然可以读取一个空值?
解决方案
是的,这是可能的(尽管非常非常不可能)。
查看这篇关于 Java 中的安全发布的文章。它还处理双重检查锁定和可能的“空”返回。
推荐阅读
- checkbox - 如何在 Flutter 中为 Checkbox 添加标签(标题文本)?
- javascript - 在 Firebase 中添加便利功能
- javascript - 用两个日期之间的日期填充对象数组
- azure - 使用 terraform 在 azure kubernates 中启用虚拟节点
- biml - 尝试在 BIML 中设置数据流 AutoAdjustBufferSize 时出错
- java - 每个单元格等于一个对象而不是行的表格
- redis - 什么是在 CLIENT LIST 中生成 redis cmd=info?
- web-services - Acumatica 从 V6 升级到 2018R2 后,基于“准备发票”屏幕的 Web API 停止工作
- postgresql - 如何在 Apache Ignite 中按需将 Posgres 表缓存为第 3 方持久性?
- python - Python子进程输出格式?