Конечно, «синхронизированный» - это просто синтаксический сахар - экстремальный полезный синтаксический сахар.
Существует блокировка, связанная с каждым объектом. Java программирование
язык не дает возможности
выполнить отдельную блокировку и разблокировку
операции; вместо этого они
неявно выполняется на высоком уровне
конструкции, которые всегда устраивают в пару
такие операции правильно. (Java
виртуальная машина, однако, обеспечивает
отдельный мониторен и мониторексит
инструкции, которые реализуют блокировку
и разблокировать операции.)
Синхронизированный оператор вычисляет
ссылка на объект; тогда
пытается выполнить операцию блокировки
на этом объекте и не продолжается
дальше, пока операция блокировки не
успешно завершено. (Замок
операция может быть отложена, потому что
правила о замках могут помешать основным
память от участия до некоторых
другой поток готов выполнить один
или более операций разблокировки.) После
операция блокировки была выполнена,
Тело синхронизированного оператора
казнены. Обычно компилятор для
Язык программирования Java гарантирует, что
операция блокировки, осуществляемая
выполнено указание монитора
до казни тела
синхронизированный оператор совпадает
с помощью операции разблокировки, выполненной
инструкция monitorexit всякий раз, когда
синхронизированный оператор завершается,
является ли завершение нормальным или
крут.
Синхронизированный метод автоматически
выполняет операцию блокировки, когда она
вызывается; его тело не выполнено
пока операция блокировки не
успешно завершено. Если метод
это метод экземпляра, он блокирует
блокировка, связанная с экземпляром для
который был вызван (то есть
объект, который будет известен как этот
во время выполнения метода
тела). Если метод статический, он
блокирует замок, связанный с
Объект класса, который представляет класс
в котором метод определен. Если
выполнение тела метода всегда
завершено, либо нормально, либо
внезапно операция разблокировки
автоматически выполняется на том же
блокировка.
Лучше всего, если переменная
когда-либо назначаться одним потоком и
используется или назначен другим, то все
доступ к этой переменной должен быть
заключены в синхронизированные методы или
синхронизированные заявления.
Хотя компилятор для Java
язык программирования нормально
гарантирует структурированное использование замков
(см. раздел 7.14 «Синхронизация»),
нет никакой гарантии, что весь код
отправлено на виртуальную машину Java
будет подчиняться этому свойству.
Реализации виртуальной Java
машины разрешены, но не обязательны
обеспечить соблюдение обоих из следующих двух
правила, гарантирующие структурированную блокировку.
Пусть T - нить, а L - замок.
Тогда:
Количество операций блокировки, выполненных T на L во время метода
вызов должен равняться количеству
разблокировать операции, выполненные т на л
во время вызова метода,
вызов метода завершается
нормально или резко.
Ни при каких условиях во время вызова метода число разблокировок не может
операции, выполняемые T на L, так как
вызов метода превышает
количество операций блокировки, выполненных
T на L с момента вызова метода.
В менее формальных условиях, во время метода
вызов каждой операции разблокировки на L
должен соответствовать некоторому предыдущему замку
операция на Л.
Обратите внимание, что блокировка и разблокировка
автоматически выполняется Java
виртуальная машина при вызове
синхронизированный метод считаетсяпроисходят во время вызова метода
призывание.