java - 在启动时控制竞争条件

标签 java concurrency

我有一些代码需要一次性执行初始化。但是这段代码没有明确的生命周期,所以在我的初始化完成之前,我的逻辑可能会被多个线程调用。所以,我想基本上确保我的逻辑代码“等待”直到初始化完成。

这是我的第一次剪辑。

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();”和一个简单的 boolean 标志。 AtomicBoolean 方便地给了我两个。不能修改 boolean 值。

CountDownLatch 正是我要找的。我还考虑过使用具有 0 个许可的 Sempahore。但 CountDownLatch 非常适合这项任务。

最佳答案

这是库和内置并发控制的奇怪组合。像这样的东西要干净得多:

public class MyClass {

  private static final CountDownLatch latch = new CountDownLatch(1);

  public void initialise() {
    initStuff();
    latch.countDown();
  }

  public void doStuff() {
    try {
      latch.await();
    } catch (InterruptedException ex) {
      throw new RuntimeException("Uh oh!", ex);
    }
    doOtherStuff();
  }

}

关于java - 在启动时控制竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877955/

相关文章:

java - JInternalFrame 置于前面并聚焦

java - 有没有办法让 Nimbus Look&Feel 为顶级 JFrame 呈现自己的窗口装饰?

java - windows 7环境下如何用Nginx配置Jboss AS 7

java - ReentrantLock 实际使用 lockInterruptibly

一旦他分配的任务之一因任何原因失败,Java 就会停止执行程序服务

c# - 如何在单元测试中为并发建模?

java - 获取应用程序正常运行时间

java - 使用 Google OAuth2 API 对 Google App 用户进行身份验证

ruby - 事件机器:并发

c# - 如何从 ConcurrentBag 中删除所有项目?