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

时间:2012-10-11 06:18:26

标签: java double-checked-locking

我看过The "Double-Checked Locking is Broken" Declaration。但是我想知道我是否通过函数创建了对象,这样可以吗?

    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...
    }

1 个答案:

答案 0 :(得分:5)

不,它不会有所作为添加功能不会有任何区别。你的功能什么也没做。

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

private volatile Helper helper = null;

java中Lazy初始化的正确方法之一是Initialization-on-demand holder idiom 。这依赖于内部类在被引用之前不会被加载的事实。

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

    public static Helper getHelper() {
        return HelperHolder.helper;
    }
}