我只是偶然发现了下面的代码,并且想知道是否有更漂亮的替代产品具有相同的性能。

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


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

在静态环境中进行初始化是没有选择的。

最佳答案

这种双重检查惯用语(DCI或DCL用于双重检查锁定)以其缺陷而著称,原因是指令重新排序。

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

老实说,它已经不那么普遍了,媒体报道如此糟糕……大声笑。

09-27 14:47