双重检查锁定作为抗图案[复制](Double-checked locking as an anti-

2019-10-20 16:36发布

这个问题已经在这里有一个答案:

  • Java的双重检查锁定 11个回答

有一个共同的信念和多个源(包括维基声称此成语是一个反模式)。

  1. 什么是对在生产代码中使用它给出正确执行的参数被使用(例如,使用挥发性

  2. 什么是在多线程环境中实现延迟初始化适当的替代品? 锁定整个方法可能会成为一个瓶颈,甚至在现代的同步是比较便宜的,它仍然要慢得多尤其是在争。 静态持有者似乎是一个特定语言和有点丑陋的黑客(至少对我来说)。 基于原子公司的实现似乎无法从传统的DCL如此不同,同时允许多个计算或需要更复杂的代码。 例如,Scala是仍然使用 DCL实施懒值,同时提出了另外的似乎要复杂得多。

Answer 1:

不要使用双重检查锁定。 永远。 这是行不通的。 不要试图找一个黑客,使其工作,因为它可能无法在稍后的JRE。

据我所知,目前还没有其他方式保存延迟初始化不是锁定整个对象/同步。

synchronized (lock) {
  // lookup

  // lazy init
}

对于单身的静态持有人(详见@trashgod提到)是很好的,但不会保持单身,如果你有多个类加载器。

如果您需要在多类加载器的环境懒单,使用的ServiceLoader 。



文章来源: Double-checked locking as an anti-pattern [duplicate]