Mutex
Mutex — принцип взаимного исключения: в критической секции в каждый момент находится не более одного потока. Аналогия из исходной заметки — один микрофон: говорить может только тот, кто им владеет.
В Java нет стандартного класса Mutex. Этот механизм дают:
- монитор объекта вместе с
synchronized; Lock, чаще всегоReentrantLock;- атомарные операции, если защищать составной инвариант не требуется.
private final Lock lock = new ReentrantLock();
private int balance;
void add(int delta) {
lock.lock();
try {
balance += delta;
} finally {
lock.unlock();
}
}finally обязателен: иначе исключение оставит блокировку захваченной. ReentrantLock в отличие от synchronized умеет tryLock(), прерываемое ожидание и несколько Condition. При этом обе блокировки реентерабельны: владелец может войти повторно.
Mutex не равен семафору: mutex имеет единственного владельца, а семафор считает разрешения и может пропустить несколько потоков.
На собеседовании
- Есть ли в Java класс
Mutex? Нет; обычно имеют в виду монитор илиLock. - Почему
unlock()помещают вfinally? Чтобы освободить блокировку при любом выходе из критической секции. - Что дает взаимное исключение кроме атомарности блока? Для корректно синхронизированных захватов и освобождений — еще и видимость памяти.