#java #многопоточность #concurrency
У меня есть два потока. В одном потоке, который запустился сразу имеется такой код public void run(){ MONITOR.wait(); ...} Во втором потоке, который стартует через 10 секунд после первого, такой код: public void run(){ MONITOR.notify(); MONITOR.wait();...} Может ли получиться, что оба потока будут в wait? Такой вопрос мне задали на собеседовании, я сказал, что не может, мне сказали вы ошиблись подумайте. Кто был прав? Джава док на моей стороне, но все же хотелось уточнить. Можете привести пример ситуации, когда оба потока будут в wait одновременно, из-за каких-то причин? Первое что приходит в голову на второй вопрос - это поменять wait и notify во втором потоке местами.
Ответы
Ответ 1
Самый, как мне кажется, простой вариант ответа следующий. Если система сильно нагружена, то даже если первый поток запущен на 10 секунд раньше, это не значит что он первым захватит монитор и войдет synchronized блок (может до этого выполняются более приоритетные задачи на компьютере). Соответственно, возможна ситуация когда первым захватит монитор второй поток. Следовательно, второй поток может выполнить MONITOR.notify(); тогда, когда на первом потоке еще не вызвали MONITOR.wait(); Вследствие этого, оба потока уходят в wait.
Комментариев нет:
Отправить комментарий