Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > wait/notify


Автор: Aristotelb 19.12.2007, 21:13
Почему методы wait/notify/notifyAll не объявлены как synchronized?

в чем тайный смысл:
Код

synchronized(sync){
   sync.wait();
..............
}

если после вызова wait монитор всеравно отпускается

Автор: Dims 19.12.2007, 21:31
Смысл wait в том и состоит: "отпустить ранее захваченный монитор и ждать сигнала notify". Если бы wait было бы объявлено, как synchronized, то оно стало бы бессмысленным, так как оно (1) захватывало бы монитор, а потом (2) сразу же его отпускало бы.

Смысл в том, что монитор должен быть захвачен где-то ещё (при помощи seynchronized) потом проделана какая-то работа, которая требует, чтобы на время монитор был отпущен, чтобы другой поток смог тоже поработать над объектом.

В простейшем случае захватывается именно тот объект, над которым совместно работают потоки.

Например. Кирпичник занял место у стенки (synchronized стенка), положил кирпич (работа), отошёл (wait стенка) и позвал следующего рабочего (notify). Теперь к стенке подошёл растворщик (synchronized стенка), положил раствор (работа), отошёл (wait стенка) и позвал опять кирпичника (notify).

Так два потока работают по очереди над одним объектом.

Добавлено через 1 минуту и 16 секунд
P.S. После wait поток дальше не идёт, он ждёт, пока ему просигналят. И, когда это происходит, он переходит на следующую строчку и опять захватывает монитор.

Автор: Aristotelb 19.12.2007, 22:51
Наверное так. 

Просто читал статью ИМХО классного специалиста по java, там это вопрос выделен отдельным пунктом.

http://www.skipy.ru/technics/synchronization.html#wait_notify

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)