#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.
Комментариев нет:
Отправить комментарий