有一个共同的信念和多个来源(包括wiki)声称这个成语是反模式。
如果使用正确的实现(例如,使用 volatile )
在多线程环境中实现延迟初始化的适当选择是什么?锁定整个方法可能会成为一个瓶颈,即使现代同步相对便宜,它仍然会慢得多,特别是在竞争中。静态持有者似乎是一种语言特定的,有点难看的黑客(至少对我而言)。基于原子的实现似乎与传统的DCL没有太大差别,同时允许多次计算或需要更复杂的代码。例如,Scala是用于实现惰性值的still using DCL,而提议的替代方案似乎要复杂得多。
答案 0 :(得分:-2)
不要使用双重检查锁定。永远。这是行不通的。不要试图找到一个黑客来使它工作,因为它可能不会在以后的JRE上。
据我所知,延迟初始化没有其他保存方法,而不是锁定整个对象/同步。
synchronized (lock) {
// lookup
// lazy init
}
对于单身人士来说,静态持有人(如提到的@trashgod)很不错,但如果您有多个类加载器,则不会保持单一。
如果您需要在多类加载器环境中使用延迟单例,请使用ServiceLoader。