小编典典

调用者阻塞直到getFoo()准备好值?

java

我有一个Java Thread,它公开了其他线程要访问的属性:

class MyThread extends Thread {
   private Foo foo;
   ...
   Foo getFoo() {
     return foo;
   }
   ...
   public void run() { 
     ...
     foo = makeTheFoo();
     ...
   }
}

问题是从运行到foo可用为止需要花费很短的时间。呼叫者可以getFoo()在此之前致电并获得null。我希望它们只是在初始化发生后立即阻塞,等待并获取值。(foo此后永远不会更改。)直到准备就绪,这将需要几毫秒的时间,因此我对这种方法感到满意。

现在,我可以做到这一点,wait()并且notifyAll()有95%的机会我会做对的。但是我想知道你们所有人将如何做。有一种原始的java.util.concurrent,将做到这一点,我已经错过了?

或者,您将如何组织它?是的,使foo挥发。是的,同步一个内部锁Object,并将检查放入while循环中,直到不是null。我有什么想念的吗?


阅读 132

收藏
2020-11-16

共1个答案

小编典典

如果foo仅初始化一次,CountDownLatch则非常适合。

class MyThread extends Thread {

  private final CountDownLatch latch = new CountDownLatch(1);

  ...

  Foo getFoo() throws InterruptedException
  {
    latch.await(); /* Or use overload with timeout parameter. */
    return foo;
  }

  @Override
  public void run() {
    foo = makeTheFoo()
    latch.countDown();
  }

}

闩锁提供与volatile关键字相同的可见性行为,这意味着foo即使foo未声明,读取线程也会看到该线程分配的值volatile

2020-11-16