Java双重检查锁定,这段代码有效吗?

jin*_*i70 3 java double-checked-locking

我读过"双重锁定已破损"声明.但我想知道我是否通过函数创建对象,这样可以吗?

    class Foo { 
      private Helper helper = null;
      public Helper getHelper() {
        if (helper == null) 
          synchronized(this) {
            if (helper == null) 
              helper = createHelper();
          }    
        return helper;
      }
      private Helper createHelper() {
         return new Helper();
      }
      // other functions and members...
    }
Run Code Online (Sandbox Code Playgroud)

Ami*_*nde 5

不,它不会有所作为添加功能不会有任何区别.你的功能无所作为.

但是,如果您声明它将volatile从Java 1.5开始工作

private volatile Helper helper = null;
Run Code Online (Sandbox Code Playgroud)

在Java中进行Lazy初始化的正确方法之一是Initialization-on-demand holder习惯用法 .这依赖于内部类在被引用之前不加载的事实.

class Foo {
    private static class HelperHolder {
        public static Helper helper = new Helper();
    }

    public static Helper getHelper() {
        return HelperHolder.helper;
    }
}
Run Code Online (Sandbox Code Playgroud)