双重检查锁定作为反模式

时间:2014-08-12 10:46:48

标签: java multithreading concurrency double-checked-locking

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

  1. 如果使用正确的实现(例如,使用 volatile

  2. ,反对在生产代码中使用它的理由是什么?
  3. 在多线程环境中实现延迟初始化的适当选择是什么?锁定整个方法可能会成为一个瓶颈,即使现代同步相对便宜,它仍然会慢得多,特别是在竞争中。静态持有者似乎是一种语言特定的,有点难看的黑客(至少对我而言)。基于原子的实现似乎与传统的DCL没有太大差别,同时允许多次计算或需要更复杂的代码。例如,Scala是用于实现惰性值的still using DCL,而提议的替代方案似乎要复杂得多。

1 个答案:

答案 0 :(得分:-2)

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

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

synchronized (lock) {
  // lookup

  // lazy init
}

对于单身人士来说,静态持有人(如提到的@trashgod)很不错,但如果您有多个类加载器,则不会保持单一。

如果您需要在多类加载器环境中使用延迟单例,请使用ServiceLoader