3

我已阅读“双重检查锁定已损坏”声明。但我想知道如果我通过函数创建对象,可以吗?

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

1 回答 1

5

不,它不会有任何区别,添加一个功能不会有任何区别。而你的功能什么也不做。

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

private volatile Helper helper = null;

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

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

    public static Helper getHelper() {
        return HelperHolder.helper;
    }
}
于 2012-10-11T06:32:44.620 回答