Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Может ли завейтится все приложения если я использую один монитор?

#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.

Комментариев нет:

Отправить комментарий