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? Чтобы освободить блокировку при любом выходе из критической секции.
  • Что дает взаимное исключение кроме атомарности блока? Для корректно синхронизированных захватов и освобождений — еще и видимость памяти.