#multithreading #winapi #mutex #monitor #condition-variable
Вопрос:
Каждый объект Java (и его класс) имеет связанный монитор. В терминах pthread монитор Java эквивалентен комбинации возвращаемого мьютекса и переменной условия.
Для блокировки Win32 API предоставляет объекты мьютекса (которые являются реентерабельными, но тяжелыми) и Критические разделы (которые не являются реентерабельными, но легкими). Он также предоставляет другие конструкции синхронизации, такие как семафоры и события, но не имеет явного понятия переменной условия.
Если бы я писал JVM, как бы я мог использовать эти концепции Win32 для реализации мониторов Java?
Ответ №1:
В Windows есть функция SignalObjectAndWait (), которую можно использовать очень похоже на ожидание переменной состояния в мониторе. Вы можете использовать событие (то есть Сброс) и Мьютекс, а затем использовать PulseEvent (), чтобы выполнить эквивалент сигнализации переменной условия.
Комментарии:
1. И SignalObjectAndWait, и PulseEvent ненадежны. При определенных условиях они не работают. SignalObjectAndWait не гарантирует, что он будет атомарным. PulseEvent не работает, если в это время происходят вызовы APC ядра. Сочетание как SignalObjectAndWait, так и PulseEvent может привести к катастрофическим последствиям.
Ответ №2:
Я предлагаю вам взглянуть на исходный код OpenJDK, чтобы увидеть, как был реализован класс ReentrantLock.
(Я сам не проверял, поэтому не уверен в ответе).
блокировки util.concurrent реализованы с использованием собственного API.
Комментарии:
1. В Windows он реализован с использованием собственного API, а не мониторов Java.
2. Я изо всех сил пытаюсь найти соответствующий исходный код. Не могли бы вы указать мне правильное направление?