来自维基百科的经典破坏双重检查锁定的略微修改版本:
class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) { synchronized(this) { if (helper == null) { // Create new Helper instance and store reference on // stack so other threads can't see it. Helper myHelper = new Helper(); // Atomically publish this instance. atomicSet(helper, myHelper); } } } return helper; } }
假设基础原子操作库正常工作,只是简单地发布新创建的Helper实例原子使这个双重检查的锁定习惯安全吗?我意识到在Java中,人们可以使用volatile
,但即使示例是伪Java,这应该是一个与语言无关的问题.
也可以看看:
双重检查锁定物品
它完全取决于您的平台/语言的确切内存模型.
我的经验法则:就是不要这样做.无锁(或减少锁定,在这种情况下)编程很难,除非你是一个线程忍者,否则不应该尝试.你应该只有在你有真正需要它的分析证明时才考虑它,在这种情况下,你会获得关于该特定平台的线程绝对最好和最新的书,看看它是否可以帮助你.
我不认为你可以用语言无关的方式回答这个问题而不必彻底摆脱代码.这一切都取决于您的伪代码的工作方式synchronized
和atomicSet
工作方式.