如何确保 initialize() 方法只被调用一次?下面是我想重构以使用 AtomicBoolean 的线程不安全版本。我想要的是 initialize() 只被调用一次
if (!initialized)
{
initialize();
initialized = true;
}
Run Code Online (Sandbox Code Playgroud)
原子布尔值对您来说是不够的,因为即使尚未完成初始化,进入代码块的第二个线程也会失败。试试这个,它会阻塞第二个,只有在第一个还没有完成时才会并行,并且在初始化完成后会非常快:
volatile boolean initialized = false;
private final Object LOCK = new Object();
public void ensureInitialized() {
if( !initialized ) {
synchronized(LOCK) {
if( !initialized ) {
initialize();
initialized = true;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这也被称为双重检查锁定理念,这种方式是正确的。
| 归档时间: |
|
| 查看次数: |
2484 次 |
| 最近记录: |