首页 > 解决方案 > 高性能和线程安全的初始化块

问题描述

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

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

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

在静态上下文中进行初始化是没有选择的。

标签: javamultithreadingsynchronizationthread-safetysynchronized

解决方案


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

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

老实说,它不再那么常见了,有这么多坏消息……哈哈。


推荐阅读