Java双重检查锁定,这段代码能工作吗?

12 浏览
0 Comments

Java双重检查锁定,这段代码能工作吗?

我已经阅读了《\"双重检查锁定是错误的\"声明》。但我想知道如果我通过一个函数创建对象,那样会不会没问题?\n

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

0
0 Comments

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

在上述内容中,提到了一个问题:在代码中添加一个函数不会有任何影响,并且你的函数什么也没做。然而,如果将其声明为volatile,它将从Java 1.5开始工作。

这里给出了一种正确的延迟初始化方式,即Initialization-on-demand holder idiom。这种方式依赖于内部类在被引用之前不会被加载。

所以,如果我像这样编写createHelper:helper = Foo.getHelper();,可以吗?

是的,完全可以。

0