Я читал об обмене данными между потоками в Java, используя wait / notify / notifyAll.
Я прошел через этот ответ: https://stackoverflow.com/a/36276832
Есть 2 темы и 1 основная тема. Основной поток сделать notifyAll
. Он пробуждает оставшиеся 2 нити, и обе нити печатают
":syncronized block have finished"
Но я читал, что если 2 потока ожидают блокировки, notifyAll будет активировать каждый поток, но блокировка будет получена только 1 потоком.
Итак, мой вопрос: как получается, что потоки t1 и t2 завершают свое выполнение?
Когда я изменяю с lock.notifyAll();
на lock.notify();
, программа на Java никогда не заканчивается.
Один поток из t1 / t2 будет в состоянии ожидания.
Может кто-нибудь ответить, пожалуйста. Я могу объяснить мои сомнения в случае, если они не совсем понятны.
Проблема в простых словах: Если 2 потока ожидают одинаковую блокировку, а 3-й поток уведомляет все, только один из них получает блокировку, другой остается в состоянии ожидания, поэтому в приведенном выше случае почему оба потока могут завершить выполнение?