我有一些代码需要进行一次初始化。但是这段代码没有明确的生命周期,所以我的逻辑可能会在我的初始化完成之前被多个线程调用。所以,我想基本确保我的逻辑代码“等待”,直到初始化完成。启动时控制竞态条件
这是我的第一次切割。
public class MyClass {
private static final AtomicBoolean initialised = new AtomicBoolean(false);
public void initialise() {
synchronized(initialised) {
initStuff();
initialised.getAndSet(true);
initialised.notifyAll();
}
}
public void doStuff() {
synchronized(initialised) {
if (!initialised.get()) {
try {
initialised.wait();
} catch (InterruptedException ex) {
throw new RuntimeException("Uh oh!", ex);
}
}
}
doOtherStuff();
}
}
我基本上要确保这会做什么,我认为它会做的事情 - 块doStuff直到初始化是真实的,那我绝不错过的竞争条件,其中doStuff可能会被卡住在一个永远不会到达的Object.wait()上。
编辑:
我无法控制线程。我希望能够控制什么时候所有的初始化完成,这就是为什么doStuff()不能调用initialise()。
我使用了一个AtomicBoolean,因为它是一个值持有者和一个可以同步的对象的组合。我本来可以简单地有一个“公共静态最终对象锁=新对象();”和一个简单的布尔标志。 AtomicBoolean方便地给了我两个。布尔值不能被修改。
CountDownLatch正是我所期待的。我也考虑过使用0许可证的Sempahore。但CountDownLatch完美适用于这项任务。
为什么不使用静态初始化器? – 2010-05-20 21:29:14
初始化在哪里被调用? – luke 2010-05-20 21:30:22
你是否在构造函数中启动线程来执行初始化工作? – rmarimon 2010-05-20 21:30:39