Предположим есть слудующий код.
Тред 2:
this.surface = new Surface(surf_texture);
// initialized_s - это Object()
synchronized (this.initialized_s) {
this.initialized_s.notify();
}
Тред 1:
thread.start();
synchronized (thread.initialized_s) {
while (thread.surface == null) {
try {thread.initialized_s.wait();} catch (InterruptedException e) {}
}
}
Насколько я понимаю, нет никаких гарантий, что изменения переменной
surface
будут когда-нибудь видны.
Когда мы вернемся из wait()
, мы будем видеть null
.
Далее (т.к. мы тестируем в цикле) мы зайдем в wait()
еще раз.
Но т.к. это был настоящий wake-up, вызванный notify()
,
то второго notify()
уже не будет. Насколько я понимаю, далее wait()
снимет
блокировку, снова переведет тред в сон и мы так и останемся на этом месте.
Вопросы:
1) Как это починить?
2) Хотелось указание на раздел/главу/страницу авторитетного источника, где говорится, что такой-то и такой-то способ точно дает гарантию.