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