如何确保initialize()方法仅被调用一次?以下是我要重构为使用AtomicBoolean的线程不安全版本。我想要的是initialize()仅被调用一次
if (!initialized)
{
initialize();
initialized = true;
}
最佳答案
原子布尔值对您来说是不够的,因为即使尚未完成初始化,进入代码块的第二个线程也将无法通过。尝试执行此操作,只有在第一个尚未完成的情况下,它才会阻塞第二个并行操作,并且在初始化完成后将非常快:
volatile boolean initialized = false;
private final Object LOCK = new Object();
public void ensureInitialized() {
if( !initialized ) {
synchronized(LOCK) {
if( !initialized ) {
initialize();
initialized = true;
}
}
}
}
这也称为双重检查锁定概念,这样就可以正确完成。