Спецификация Java 11: 17.1. Синхронизация

Язык программирования Java предоставляет несколько механизмов для связи между потоками. Самый простой из этих методов - синхронизация, которая реализуется с помощью мониторов. Каждый объект в Java связан с монитором, который поток может блокировать или разблокировать. Только один поток одновременно может удерживать блокировку на мониторе. Любые другие потоки, пытающиеся заблокировать этот монитор, блокируются до тех пор, пока они не смогут получить блокировку на этом мониторе. Поток t может блокировать конкретный монитор несколько раз; каждая разблокировка отменяет эффект одной операции блокировки.

Оператор synchronized (§14.19) вычисляет ссылку на объект; затем он пытается выполнить действие блокировки на мониторе этого объекта и не продолжает дальше, пока действие блокировки не будет успешно завершено. После выполнения действия блокировки выполняется тело синхронизированного оператора. Если выполнение тела когда-либо завершается, нормально или внезапно, действие разблокировки автоматически выполняется на том же мониторе.

Синхронизированный метод (§8.4.3.6) автоматически выполняет действие блокировки при его вызове; его тело не выполняется, пока действие блокировки не будет успешно завершено. Если метод является методом экземпляра, он блокирует монитор, связанный с экземпляром, для которого он был вызван (то есть объект, который будет называться this во время выполнения тела метода). Если метод является статическим, он блокирует монитор, связанный с объектом Class, который представляет класс, в котором определен метод. Если выполнение тела метода когда-либо завершается, обычно или внезапно, действие разблокировки автоматически выполняется на том же мониторе.

Язык программирования Java не предотвращает и не требует обнаружения условий взаимоблокировки. Программы, в которых потоки удерживают (прямо или косвенно) блокировки на нескольких объектах, должны использовать обычные методы предотвращения взаимоблокировок, создавая при необходимости блокирующие примитивы более высокого уровня, которые не блокируются.

Другие механизмы, такие как чтение и запись volatile переменных и использование классов в пакете java.util.concurrent, предоставляют альтернативные способы синхронизации.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки