如何使用 AtomicBoolean 实现这一点?

Ara*_*ram 3 java

如何确保 initialize() 方法只被调用一次?下面是我想重构以使用 AtomicBoolean 的线程不安全版本。我想要的是 initialize() 只被调用一次

if (!initialized) 
{
   initialize();
   initialized = true;
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 5

原子布尔值对您来说是不够的,因为即使尚未完成初始化,进入代码块的第二个线程也会失败。试试这个,它会阻塞第二个,只有在第一个还没有完成时才会并行,并且在初始化完成后会非常快:

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)

这也被称为双重检查锁定理念,这种方式是正确的。

  • 人们可以依赖“this”而不是创建一个虚拟锁对象()。 (2认同)