Java Double检查锁定 - 初始化方法

时间:2015-11-12 13:07:38

标签: java multithreading double-checked-locking

考虑一下这个例子:

class SomeClass{
     private Foo val;

     String getVal(){
           if(val == null){
                synchronized(this){
                      if(val ==null)
                           val = generateFoo();
                }
          }
     }

     Foo generateFoo(){
          //some code
          return new Foo();
     }
}

在这种情况下是否需要挥发性?

2 个答案:

答案 0 :(得分:0)

根据The "Double-Checked Locking is Broken" Declaration,似乎需要使其变得不稳定。

  

JDK5及更高版本扩展了volatile的语义,以便系统不允许针对任何先前的读取或写入重新排序volatile的写入,并且不能针对任何后续读取重新排序volatile的读取或写。有关详细信息,请参阅Jeremy Manson博客中的此条目。

     

通过此更改,可以通过将辅助字段声明为volatile来使Double-Checked Locking成语工作。这在JDK4及更早版本下不起作用。

但是,我可以提出不同的建议吗?

不要使用singletons-the-design-pattern。在API中明确说明它应该是单例。允许您的班级用户将其用作单身人士,但这样做是有意义的,例如使用Singleton-as-a-scopeService Locator

测试更容易,更容易使用,这意味着每次使用单身人士时杀死小猫的女神都不会杀死小猫。每个人都很开心。

答案 1 :(得分:0)

没有必要。 你可以去AtomicReference。

AtomicReference atomicStringReference =     新的AtomicReference(val);

点击此处:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html