高性能和线程安全的初始化块
Performant and thread-safe initialization block
我偶然发现了以下代码,我想知道是否有更漂亮的替代方案具有相同的性能。
if (!isInitialized) {
synchronized (this) {
if (!isInitialized) {
// Initialization code
isInitialized = true;
}
}
}
可以肯定的是,可以删除外部 if 语句而不影响线程安全。但是当多个线程同时调用代码时,它会对性能产生影响,因为 isInitialized 检查只能在一个线程中一次完成。
在静态上下文中进行初始化是不可取的。
这种双重检查习语(用于双重检查锁定的 DCI 或 DCL)因其指令重排序的缺陷而闻名。
仅当您将 isInitialized
变量声明为 volatile 时才有效,并且仅适用于 jdk1.5+(当 volatile 语义和内存模型得到修复时)。
老实说,它不再那么普遍了,有那么多坏消息...大声笑。
我偶然发现了以下代码,我想知道是否有更漂亮的替代方案具有相同的性能。
if (!isInitialized) {
synchronized (this) {
if (!isInitialized) {
// Initialization code
isInitialized = true;
}
}
}
可以肯定的是,可以删除外部 if 语句而不影响线程安全。但是当多个线程同时调用代码时,它会对性能产生影响,因为 isInitialized 检查只能在一个线程中一次完成。
在静态上下文中进行初始化是不可取的。
这种双重检查习语(用于双重检查锁定的 DCI 或 DCL)因其指令重排序的缺陷而闻名。
仅当您将 isInitialized
变量声明为 volatile 时才有效,并且仅适用于 jdk1.5+(当 volatile 语义和内存模型得到修复时)。
老实说,它不再那么普遍了,有那么多坏消息...大声笑。