3. Что такое монитор? Как монитор реализован в java?

3. Что такое монитор? Как монитор реализован в java?

UNKNOWN

Мютекс («mutual exclusion» — «взаимное исключение») – это специальный объект для синхронизации нитей/процессов. Он может принимать два состояния – занят и свободен. Если упростить, то мютекс – это boolean-переменная, которая принимает два значения: занят(true) и свободен(false).

Шлагбаум

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

Мютекс прикреплен к каждому объекту в Java. Прямой доступ к мютексу есть только у Java-машины. От программиста он скрыт.

А работать с мютексом в Java можно посредством монитора.

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

Надстройка над мютексом, который обеспечивает правильную работу с ним. Ведь мало пометить, что объект занят, надо еще обеспечить, чтобы другие нити не пробовали воспользоваться занятым объектом.

В Java монитор реализован с помощью ключевого слова synchronized.

Когда ты пишешь блок synchronized, то компилятор Java заменяет его тремя кусками кода:

  1. В начале блока synchronized добавляется код, который отмечает мютекс как занятый.
  2. В конце блока synchronized добавляется код, который отмечает мютекс как свободный.
  3. Перед блоком synchronized добавляется код, который смотрит, если мютекс занят – то нить должна ждать его освобождения.

Когда ты начинаешь писать код своей нити и в ней обращаешься к различным объектам своей программы, то при вызове каждого метода, ты должен задуматься – а безопасен (thread-safe) ли этот вызов? Все immutable объекты являются thread-safe.

Все объекты, к которым происходит обращение из разных нитей, должны быть thread-safe.

Только методы и блоки могут быть синхронизированы, но не переменные и классы. Если метод, в котором содержится критически важная «многопоточная» логика, статический, синхронизация будет осуществляться по классу.


Предыдущий вопрос: 2. Чем Thread отличается от Runnable? Когда нужно использовать Thread, а когда Runnable?

Следующий вопрос: 4. Что такое синхронизация? Какие способы синхронизации существуют в java?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне

Report Page