3. Что такое монитор? Как монитор реализован в java?
UNKNOWNМютекс («mutual exclusion» — «взаимное исключение») – это специальный объект для синхронизации нитей/процессов. Он может принимать два состояния – занят и свободен. Если упростить, то мютекс – это boolean-переменная, которая принимает два значения: занят(true) и свободен(false).
Шлагбаум
Когда нить хочет монопольно владеть некоторым объектом, она помечает его мютекс занятым, а когда закончила работу с ним – помечает его мютекс свободным.
Мютекс прикреплен к каждому объекту в Java. Прямой доступ к мютексу есть только у Java-машины. От программиста он скрыт.
А работать с мютексом в Java можно посредством монитора.
Монитор – это специальный механизм (кусок кода) гарантирует, что только один поток может выполнять данный раздел (или разделы) кода в любой момент времени.
Надстройка над мютексом, который обеспечивает правильную работу с ним. Ведь мало пометить, что объект занят, надо еще обеспечить, чтобы другие нити не пробовали воспользоваться занятым объектом.
В Java монитор реализован с помощью ключевого слова synchronized.
Когда ты пишешь блок synchronized, то компилятор Java заменяет его тремя кусками кода:
- В начале блока synchronized добавляется код, который отмечает мютекс как занятый.
- В конце блока synchronized добавляется код, который отмечает мютекс как свободный.
- Перед блоком synchronized добавляется код, который смотрит, если мютекс занят – то нить должна ждать его освобождения.
Когда ты начинаешь писать код своей нити и в ней обращаешься к различным объектам своей программы, то при вызове каждого метода, ты должен задуматься – а безопасен (thread-safe) ли этот вызов? Все immutable объекты являются thread-safe.
Все объекты, к которым происходит обращение из разных нитей, должны быть thread-safe.
Только методы и блоки могут быть синхронизированы, но не переменные и классы. Если метод, в котором содержится критически важная «многопоточная» логика, статический, синхронизация будет осуществляться по классу.
Предыдущий вопрос: 2. Чем Thread отличается от Runnable? Когда нужно использовать Thread, а когда Runnable?
Следующий вопрос: 4. Что такое синхронизация? Какие способы синхронизации существуют в java?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне