Когда процесс или поток блокируется, он всегда ждет уведомления или просто спит какое-то время?
Я наткнулся на этот вопрос, когда читал "В JVM обычно реализована блокировка путем приостановки заблокированного потока и его повторного планирования позднее" с http://www.ibm.com/developerworks/java/library/j-jtp04186/?S_TACT=105AGX52&S_CMP=cn-a-j
Когда мы говорим, что процесс или поток блокируется при выполнении операций ввода-вывода (чтение, запись) или при получении доступа к какому-либо исключительному ресурсу (блокировка, синхронизация), когда он получит повторное выполнение? они постоянно ждут, пока не получат уведомление откуда-нибудь, или он просто выйдет из своего хода и через некоторое время снова запустится?
Это как-то связано с указанной платформой? ОС или JVM?
1 ответ
Это перешло бы к лежащей в основе ОС, которая должна обеспечить поддержку многопоточности для виртуальной машины - это должно быть так, чтобы приложение Java могло гармонично сосуществовать со всеми другими процессами и потоками, которые обычно загружаются в ОС - браузерами, боковыми панелями, антивирус, видео / аудио проигрыватели, клиенты Torrent, внутренние потоки ОС и т. д. и т. д.
Код заблокированного потока не получает циклов ЦП вообще. Поток в этом состоянии является просто неиспользуемым на данный момент выделением стека и дополнительным указателем структуры / класса в контейнере в ядре, ожидая, пока что-то еще изменит свое состояние. Если он остается заблокированным или длительное время, стек может даже быть выгружен в загруженной системе.
Так что да, они постоянно ждут, пока не получат уведомление откуда-то.