Эта история изначально была опубликована на моем [email protected] здесь.

Как все мы знаем, в языке программирования Java каждый объект в Java связан с монитором, который поток может заблокировать или разблокировать.

Каждый объект, помимо связанного монитора, имеет связанный набор ожидания. Когда объект создается впервые, его набор ожидания пуст. Элементарные действия, которые добавляют потоки и удаляют потоки из наборов ожидания, являются атомарными. Наборы ожидания управляются исключительно методами Object.wait, Object.notify(Notification Action) и Object.notifyAll(Notification Action).

Только один поток одновременно может удерживать блокировку на мониторе (т. Е. В любой момент только один поток может войти в критическую область, которая определяется планировщиком Java на основе некоторых критериев (например, FIFO)). Любые другие потоки, пытающиеся заблокировать этот монитор, блокируются до тех пор, пока они не смогут получить блокировку на этом мониторе (т. Е. Оставшиеся потоки ждут в блоке Wait Set монитора. Если текущий поток приостановлен по какой-либо причине, то поток возвращается в область ожидания, а затем перенесена на получение критической области).

Как объяснялось в моем блоге об информации об управлении объектами (Java-примитивы против Wrapper: какой из них использовать), каждый java-объект содержит информацию о блокировке.

Если какой-либо поток хочет получить доступ к переменным экземпляра этого объекта; тогда поток должен «владеть» блокировкой объекта (установить какой-либо флаг в области памяти блокировок). Это критическая область или область памяти блокировок, в которой хранится информация, относящаяся к блокировкам.

Теперь, после краткого знакомства с монитором объектов Java, давайте перейдем к определению мониторов и блокировок:

Что такое монитор? Согласно Википедии

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

Что такое замок? Из официальной документации Блокировок и синхронизации (https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html):

  • Синхронизация основана на внутренней сущности, известной как внутренняя блокировка или блокировка монитора.
  • С каждым объектом связана внутренняя блокировка. По соглашению поток должен получить блокировку монитора объекта, прежде чем обращаться к нему, а затем снять блокировку монитора, когда он закончит с ним. Говорят, что поток владеет блокировкой между моментом, когда он получил блокировку и снял блокировку. Пока поток владеет блокировкой монитора, никакой другой поток не может получить такую ​​же блокировку. Другой поток заблокируется, когда попытается получить блокировку.
  • Когда поток снимает блокировку, между этим действием и любым последующим получением такой же блокировки устанавливается связь «происходит до».
  • Все неявные мониторы реализуют характеристики реентерабельности. Реентерабельность означает, что блокировки привязаны к текущему потоку. Поток может безопасно получать одну и ту же блокировку несколько раз, не попадая в тупиковые ситуации.

В Java это делается с помощью ключевого слова synchronized или wait и notify.

Таким образом, монитор и замок нельзя сравнивать по различиям, скорее, они дополняют друг друга. Каждый объект в Java связан с монитором, который поток может заблокировать или разблокировать.

Дальнейшее чтение и просмотр:

Вопросов ? Предложения ? Комментарии ?

Что дальше? Подписывайтесь на меня на Medium, чтобы первым читать мои истории.