Какой примитив используется для реализации синхронизированного ключевого слова?
Когда мы используем synchronized
ключевое слово в Java, какой примитив синхронизации используется точно? Lock, Semaphore, Monitor, Mutex
?
РЕДАКТИРОВАТЬ: Как JVM реализует блокировку на родном уровне?
2 ответа
На уровне байт-кода Java имеет monitorenter
а также monitorexit
операции, описанные на этой странице спецификации виртуальной машины Java, со вставленными ниже фрагментами (objectref - операнд для операции, взятой из стека):
фрагмент мониторинга
С каждым объектом связан монитор. Поток, который выполняет monitorenter, становится владельцем монитора, связанного с objectref. Если другой поток уже владеет монитором, связанным с objectref, текущий поток ждет, пока объект не будет разблокирован, а затем снова пытается получить право собственности. Если текущему потоку уже принадлежит монитор, связанный с objectref, он увеличивает счетчик в мониторе, указывая количество раз, когда этот поток вошел в монитор. Если монитор, связанный с objectref, не принадлежит ни одному потоку, текущий поток становится владельцем монитора, устанавливая счетчик записей этого монитора равным 1.
фрагмент мониторексита
Текущий поток должен быть владельцем монитора, связанного с экземпляром, на который ссылается objectref. Поток уменьшает счетчик, указывая количество раз, когда он вошел в этот монитор. Если в результате значение счетчика становится равным нулю, текущий поток освобождает монитор. Если монитор, связанный с objectref, становится свободным, другим потокам, ожидающим получения этого монитора, разрешается попытаться сделать это.
Таким образом, "монитор" - это ответ, и ни this, ни JLS, на которые нет ссылок в ответе NPE, не определяют, что происходит на уровне нативного кода. Если у вас есть конкретная платформа (ЦП и операционная система) и конкретная реализация JVM (включая версию), вы, конечно, можете либо посмотреть на источник JVM (если это JVM с открытым исходным кодом), либо спросить здесь.
Я также встречался в этом блоге с 1997 года, в котором есть больше деталей.
Из JLS ( §17.1. Синхронизация):
Язык программирования Java предоставляет несколько механизмов для взаимодействия между потоками. Основным из этих методов является синхронизация, которая реализуется с помощью мониторов. Каждый объект в Java связан с монитором, который поток может заблокировать или разблокировать. Только один поток одновременно может удерживать блокировку на мониторе. Любые другие потоки, пытающиеся заблокировать этот монитор, блокируются, пока они не смогут получить блокировку на этом мониторе. Поток t может заблокировать определенный монитор несколько раз; каждая разблокировка отменяет эффект одной операции блокировки.
Таким образом, "монитор" является ответом на ваш первый вопрос.
Что касается второго вопроса, это неуказанная деталь реализации.