Ответ
Lock (блокировка) — это общий механизм синхронизации для контроля доступа к общему ресурсу в многопоточной среде. Mutex (Mutual Exclusion, взаимное исключение) — это конкретный тип блокировки, гарантирующий, что только один поток может владеть ею в данный момент.
Взаимосвязь: Mutex — это простейшая, часто нереентерабельная реализация Lock.
Пример использования ReentrantLock в Java:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
Lock lock = new ReentrantLock();
void accessSharedResource() {
lock.lock(); // Захват блокировки (поток будет ждать, если она занята)
try {
// Критическая секция: работа с общим ресурсом
} finally {
lock.unlock(); // Освобождение блокировки ВСЕГДА в finally-блоке
}
}
Сравнение с synchronized: |
Особенность | synchronized |
ReentrantLock |
|---|---|---|---|
| Синтаксис | Встроен в язык (ключевое слово) | Явный API-вызов (lock(), unlock()) |
|
| Гибкость | Базовая | Расширенная (таймауты, прерываемость, честность) | |
| Рентерабельность | Да (реентерабельный) | Да (по умолчанию) |
Правило: Используйте synchronized для простых случаев, а Lock — когда нужны его продвинутые возможности.