首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用单一检查习语的延迟初始化

使用单一检查习语的延迟初始化
EN

Stack Overflow用户
提问于 2012-12-20 21:43:32
回答 2查看 679关注 0票数 1

在“有效Java,第二版”的第71项中,引入了双重检查成语和单检查成语,用于延迟实例化实例字段。

复核成语

代码语言:javascript
运行
复制
private volatile FieldType field;
FieldType getField() {
  FieldType result = field;
  if (result == null) {
    synchronized(this) {
      result == field;
      if (result == null)
        field = result = computeFieldValue();
    }
  }
  return result;
}

单选成语

代码语言:javascript
运行
复制
private volatile FieldType field;
FieldType getField() {
  FieldType result = field;
  if (result == null) {
    field = result = computeFieldValue();
  }
  return result;
}

在双重检查成语约书亚中,结果变量用于确保只读取一次易失性字段,从而提高了性能。这一点我理解,但我不明白为什么我们需要它在单一检查成语,因为我们只读了一次字段

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-20 21:46:54

在单检查成语中,如果没有结果变量,您仍然要读取它两次;一次用于null检查,一次用于返回值。

票数 5
EN

Stack Overflow用户

发布于 2012-12-20 21:59:59

我更喜欢以下惰性评估的实现:

代码语言:javascript
运行
复制
@ThreadSafe
class MyClass {
    private static class MyClassHelper {
       public static final MyClass helper = new MyClass();
    }

    public static MyClass getInstance() {
        return MyClassHelper.helper;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13980975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档