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

时间:2018-05-04 09:06:50

标签: java multithreading synchronization thread-safety synchronized

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

老实说,这已经不那么常见,有太多糟糕的新闻......大声笑。