我有一个JavaThread
它公开了其他线程想要访问的属性:
class MyThread extends Thread {
private Foo foo;
...
Foo getFoo() {
return foo;
}
...
public void run() {
...
foo = makeTheFoo();
...
}
}
问题是从运行到执行需要花费很短的时间foo
可用。来电者可以致电getFoo()
在此之前并获得null
。我宁愿他们简单地阻塞、等待,并在初始化发生后获取值。 (foo
此后永远不会更改。)准备就绪只需几毫秒,因此我对这种方法感到满意。
现在,我可以让这一切发生wait()
and notifyAll()
我有 95% 的机会做对。但我想知道你们会怎么做?是否有一个原语java.util.concurrent
那会做这个,我错过了?
或者,您将如何构建它?是的,使foo
易挥发的。是的,在内部锁上同步Object
并将支票放入while
循环直到不是null
。我错过了什么吗?
If foo
仅初始化一次,aCountDownLatch非常合适。
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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)