Что такое mutex и семафоры
Что проверяют
Знаете ли вы, что в Java взаимное исключение это не отдельный класс, а свойство монитора, и умеете ли выбрать между synchronized, явной блокировкой и семафором, объясняя выбор, а не перечисляя названия классов.
Как отвечать
Взаимное исключение даёт монитор любого объекта: блок или метод synchronized. Монитор реентерабельный и освобождается автоматически на выходе, в том числе при исключении. Когда нужны захват с таймаутом, прерываемое ожидание, честная очередь или несколько условий, берут ReentrantLock с обязательным unlock в блоке finally, а для преобладающего чтения ReentrantReadWriteLock или StampedLock.
Класс Semaphore про другое: он ограничивает число одновременно работающих потоков заданным количеством разрешений. Владельца у него нет, release может вызвать поток, который не делал acquire, поэтому семафор хорош для ограничения пула и для сигналов, но не для защиты поля.
sem.acquire();
try {
useConnection();
} finally {
sem.release();
}Стоит добавить, что для счётчиков и флагов дешевле атомарные классы и конкурентные коллекции, а самая надёжная синхронизация это её отсутствие: неизменяемые объекты и передача данных через очередь.
Где спотыкаются
Ставят acquire внутрь try, у которого в finally стоит release. Если ожидание прервали, разрешение не получено, а finally его всё равно отдаёт, и пул тихо разрастается. Захват делают до try.
Синхронизируют запись и забывают чтение. Геттер без блокировки годами возвращает устаревшее значение, потому что видимость обеспечивает не сам факт присваивания, а общий монитор или модификатор volatile.
Считают семафор с одним разрешением заменой блокировке. Он не реентерабельный: повторный acquire в том же потоке останавливает этот поток навсегда, и выглядит это как зависание без всякой конкуренции.