高性能和线程安全的初始化块

Performant and thread-safe initialization block

我偶然发现了以下代码,我想知道是否有更漂亮的替代方案具有相同的性能。

if (!isInitialized) {
    synchronized (this) {
        if (!isInitialized) {
            // Initialization code
            isInitialized = true;
        }
    }           
}

可以肯定的是,可以删除外部 if 语句而不影响线程安全。但是当多个线程同时调用代码时,它会对性能产生影响,因为 isInitialized 检查只能在一个线程中一次完成。

在静态上下文中进行初始化是不可取的。

这种双重检查习语(用于双重检查锁定的 DCI 或 DCL)因其指令重排序的缺陷而闻名。

仅当您将 isInitialized 变量声明为 volatile 时才有效,并且仅适用于 jdk1.5+(当 volatile 语义和内存模型得到修复时)。

老实说,它不再那么普遍了,有那么多坏消息...大声笑。