根据许多人的说法,除非您运行1.5或更高版本并使用volatile关键字,否则Java中常见的Double-Checked Locking惯用语已被破坏。
volatile
损坏的双重检查锁样本:
// Broken multithreaded version // "Double-Checked Locking" idiom class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) synchronized(this) { if (helper == null) helper = new Helper(); } return helper; } // other functions and members... }
该示例来自本文,该文章还提供了有关解决方法的详细信息:http : //www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Pugh的上述分析是针对Java VM的。我在Android上工作,经常使用采用Double-Checked Locking的库。dalvik VM的内存模型是否支持该惯用法?
这个问题的答案意味着内存模型应该是相同的,并且新的双重检查锁定习惯用法将起作用。