如何确保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;
            }
        }
    }
}

这也称为双重检查锁定概念,这样就可以正确完成。

10-08 00:44