1

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

  1. 鉴于使用了正确的实现(例如,使用volatile) ,反对在生产代码中使用它的论点是什么

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

4

1 回答 1

-2

不要使用双重检查锁定。曾经。这没用。不要试图找到一个 hack 来使它工作,因为它可能不会在以后的 JRE 上。

据我所知,除了锁定整个对象/同步之外,没有其他的惰性初始化方法。

synchronized (lock) {
  // lookup

  // lazy init
}

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

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

于 2014-08-12T10:54:51.350 回答