我只是偶然发现了下面的代码,并且想知道是否有更漂亮的替代产品具有相同的性能。
if (!isInitialized) {
synchronized (this) {
if (!isInitialized) {
// Initialization code
isInitialized = true;
}
}
}
当然,可以删除外部if语句,而不会影响线程安全。但是,如果多个线程同时调用代码,则会对性能产生影响,因为isInitialized检查只能一次在一个线程中完成。
在静态环境中进行初始化是没有选择的。
最佳答案
这种双重检查惯用语(DCI或DCL用于双重检查锁定)以其缺陷而著称,原因是指令重新排序。
仅当您将isInitialized
变量声明为volatile且仅在jdk1.5 +(当volatile语义和内存模型得到修复时)才有效。
老实说,它已经不那么普遍了,媒体报道如此糟糕……大声笑。