【发布时间】:2010-05-21 07:02:45
【问题描述】:
我有一些代码想要执行一次初始化。但是这段代码没有明确的生命周期,所以在我的初始化完成之前,我的逻辑可能会被多个线程调用。所以,我想基本上确保我的逻辑代码“等待”直到初始化完成。
这是我的第一次剪辑。
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 可能卡在对象上的竞争条件。 wait() 永远不会到达。
编辑:
我无法控制线程。而且我希望能够控制所有初始化完成的时间,这就是 doStuff() 不能调用 initialise() 的原因。
我使用了 AtomicBoolean,因为它是值持有者和我可以同步的对象的组合。我也可以简单地拥有一个“public static final Object lock = new Object();”和一个简单的布尔标志。 AtomicBoolean 方便地给了我两个。不能修改布尔值。
CountDownLatch 正是我想要的。我还考虑过使用具有 0 个许可证的 Sempahore。但是 CountDownLatch 非常适合这项任务。
【问题讨论】:
-
为什么不使用静态初始化器?
-
初始化在哪里被调用?
-
你是否在你的构造函数中启动一个线程来做初始化工作?
标签: java concurrency