考虑一下这个例子:
class SomeClass{
private Foo val;
String getVal(){
if(val == null){
synchronized(this){
if(val ==null)
val = generateFoo();
}
}
}
Foo generateFoo(){
//some code
return new Foo();
}
}
在这种情况下是否需要挥发性?
答案 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-scope或Service Locator。
测试更容易,更容易使用,这意味着每次使用单身人士时杀死小猫的女神都不会杀死小猫。每个人都很开心。
答案 1 :(得分:0)
没有必要。 你可以去AtomicReference。
AtomicReference atomicStringReference = 新的AtomicReference(val);
点击此处:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html