我有一个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
成为易失性变量。是的,在内部锁对象上同步,并将检查放在while
循环中,直到它不为null
。我有什么遗漏吗?