我有一个Java Thread,它公开了其他线程要访问的属性:
Thread
class MyThread extends Thread { private Foo foo; ... Foo getFoo() { return foo; } ... public void run() { ... foo = makeTheFoo(); ... } }
问题是从运行到foo可用为止需要花费很短的时间。呼叫者可以getFoo()在此之前致电并获得null。我希望它们只是在初始化发生后立即阻塞,等待并获取值。(foo此后永远不会更改。)直到准备就绪,这将需要几毫秒的时间,因此我对这种方法感到满意。
foo
getFoo()
null
现在,我可以做到这一点,wait()并且notifyAll()有95%的机会我会做对的。但是我想知道你们所有人将如何做。有一种原始的java.util.concurrent,将做到这一点,我已经错过了?
wait()
notifyAll()
java.util.concurrent
或者,您将如何组织它?是的,使foo挥发。是的,同步一个内部锁Object,并将检查放入while循环中,直到不是null。我有什么想念的吗?
Object
while
如果foo仅初始化一次,CountDownLatch则非常适合。
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。
volatile