undefined

Мютекс и монитор

Java Multithreading
6 уровень , 6 лекция
Открыта

— Привет, Амиго!

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

— Я готов слушать.

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

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

— Т.е. мютекс – это как табличка на двери – занят/свободен?

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

— А как же тогда его использовать?

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

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

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

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

1) В начале блока synchronized добавляется код, который отмечает мютекс как занятый.

2) В конце блока synchronized добавляется код, который отмечает мютекс как свободный.

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

Вот как это примерно работает:

Код Как это работает Описание
synchronized(object)
{

object.doJob();

}
while (object.mutex)
Thread.sleep(1);

object.mutex = true;

object.doJob();

object.mutex = false;
Нить спит, пока мютекс занят
(выйдем из цикла, когда мютекс освободится)Помечаем мютекс занятым

Выполняем doJob();

Помечаем мютекс свободным

На самом деле логика там другая и сложнее, но это уже детали.

— А можно подробности?

— Пока не научишься правильно этим пользоваться – в детали лезть нет смысла.

Пару уровней назад я дала тебе список всех состояний нити со стрелками переходов и списком методов, которые влияют на это состояние. Ты много запомнил?

— Не очень. Просто все быстро забывается…

— Чем меньше практики, тем меньше пользы и от теории.

Вот уровню к 40 научишься всем этим пользоваться, и я тебе объясню, как все устроено на самом деле. А пока — учись просто правильно всем пользоваться. Ясно?

— Да, спасибо, Элли.

Комментарии (42)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Юрий 29 уровень, Калининград
9 декабря 2020
Тебе с твоим голосом только в туалете кричать "TRUE!!!!!!"😁
валидатор 31 уровень
6 ноября 2020
Не помню кто конкретно писал про это все раньше, но мой конспект с того комментария гласит что: Семафор - это флаг блокировки объекта (количество потоков (счетчик), которые используются объектом можно настроить) Мьютекс - это двоичный семафор / одноместный семафор / семафор с начальным значением счетчика 1. То есть объект может быть использован только одним потоком. Монитор - скрытая логика семафора которая исполняется JVM.
Kex 38 уровень, Тольятти Expert
22 мая 2020
https://javarush.ru/groups/posts/2174-v-chem-raznica-mezhdu-mjhjuteksom-monitorom-i-semaforom Здесь более четко объяснено про мьютекс и монитор
Владимир Горбатенко 37 уровень, Одесса
18 февраля 2019
Если упростить, то мютекс – это boolean-переменная, которая принимает два значения: занят(true) и свободен(false). Разве это не одно значение? Ведь занят(true) == свободен(false). Always busy... А вот занят(true) и занят(false) - это два значения/состояния.
Джонни 35 уровень Expert
6 января 2019
—Ты много запомнил? — Не очень. Просто все быстро забывается… То чувство, когда у роботов такая же память как у людей...
Bahis 41 уровень, Manila
19 декабря 2018
Элли, я запомнил. Жду на 40м уровне подробных объяснений как это на самом деле работает.
Rihard1985 33 уровень Master
26 августа 2018
Как с чмошником общается Элли с Амиго, а Амиго думал о серьезных отношениях((
1 марта 2018
Я для себя так понял. Мютекс можно рассматривать как флаг занятости объекта, а монитор как некоторый процесс, который следит за объектом, и если этот объект занят нитью, то монитор устанавливает флаг занятости у этого объекта и блокирует к нему доступ из других нитей, после освобождения нитью сбрасывает флаг.
Виталий 39 уровень, Краснодар
7 декабря 2017
Помогло разобраться и еще мьютекс (MUTual Exclusion) - перевод - взаимное исключение.
Макс Ионов 27 уровень
5 мая 2017
Лекции Головоча по многопоточности немного рассеивают туман