A.notifyAll()
должен только пробудить поток, работающий foo()
. Очередь ожидания, в которой находятся ваши потоки wait()
, является частью условной переменной , а не lock . У блокировки есть собственная очередь ожидания, но она используется только потоками, пытающимися получить блокировку. Когда ваш поток спит в резюме, он не удерживает блокировку и не будет пытаться повторно получить его, пока другой поток не вызовет notify()
или подобное.
Тем не менее, вы должны написать свой код, предполагая, что B.wait()
действительно может проснуться в любое время. Практически это означает повторную проверку состояния, в котором ожидает поток:
with lock:
while not ready:
B.wait()
# Do stuff with protected data