有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用本地变量的单例java安全发布

在浏览这个article时,我遇到了下面的代码,它解释了安全发布字段

public class SafeLocalDCLFactory implements Factory {
  private volatile Singleton instance;

  @Override
  public Singleton getInstance() {
    Singleton res = instance;
    if (res == null) {
      synchronized (this) {
        res = instance;
        if (res == null) {
          res = new Singleton();
          instance = res;
        }
      }
    }
    return res;
  }
}

我的疑问是,为什么我们需要在getInstance()中定义局部变量res?难道volatileDCL不足以保证safe publication?在这里定义一个局部变量res,然后将其与null进行比较的目的到底是什么

编辑:本文解释了以下内容,以证明需要使用局部var。但是我们如何保护自己不返回null

The introduction of local variable here is a correctness fix, but only partial: there still no happens-before between publishing the Singleton instance, and reading of any of its fields. We are only protecting ourselves from returning "null" instead of Singleton instance


共 (1) 个答案

  1. # 1 楼答案

    它最小化了从易失性变量instance读取的次数。易失性变量访问比非易失性内存访问更昂贵,因为它通常涉及内存屏障。通过将其分配给临时变量,如果volatile变量已经初始化,则该代码只读取一次,而不是两次(一次用于检查,一次用于返回)