У меня есть 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 volatile. Да, синхронизируйтесь на внутренней блокировке Object и поместите проверку в цикл while, пока она не будет null. Я что-то пропустил?