java - 使用单一检查习语的惰性初始化

标签 java volatile lazy-initialization effective-java

在“Effective Java,第二版”的第 71 项中,为延迟实例化实例字段引入了 Double-check idiom 和 single-check idiom。

仔细检查成语

private volatile FieldType field;
FieldType getField() {
  FieldType result = field;
  if (result == null) {
    synchronized(this) {
      result == field;
      if (result == null)
        field = result = computeFieldValue();
    }
  }
  return result;
}

单次检查成语

private volatile FieldType field;
FieldType getField() {
  FieldType result = field;
  if (result == null) {
    field = result = computeFieldValue();
  }
  return result;
}

在双重检查习语中,Joshua 指出,result 变量用于确保 volatile field 仅被读取一次,从而提高性能。我理解这一点,但是我不明白为什么我们需要在单次检查习语中使用它,因为无论如何我们只读取一次 field

最佳答案

在单一检查习惯用法中,如果没有结果变量,您仍然会阅读它两次;一次用于空检查,一次用于返回值。

关于java - 使用单一检查习语的惰性初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13980975/

相关文章:

java - 如何在 Android 中进行一键登录和注册

c - 引擎盖下的 volatile

java - java原子整数可以在不声明值 volatile 的情况下实现吗?

c++ - 为什么会存在 volatile ?

java - 使用 ConcurrentHashMap 实现参数化线程安全的延迟初始化缓存(不带 volatile 关键字)

java - Spring , hibernate : failed to lazily initialize a collection

php - symfony2事件调度程序延迟加载监听器

java - 应用类来捕获<?扩展类>

java - 使用 if-else 语句的不同设计决策

java - 用于编译和运行java文件的批处理文件?