Чем отличается использование ReentrantLock от встроенного синхронизатора synchronized в Java?
Ответ от нейросети
sobes.tech AI
ReentrantLock и synchronized — оба используются для синхронизации потоков в Java, но имеют ряд отличий:
-
Гибкость: ReentrantLock предоставляет дополнительные возможности, такие как попытка захвата блокировки с таймаутом (
tryLock()), возможность прерывания потока при ожидании блокировки (lockInterruptibly()), а также возможность проверки, захвачена ли блокировка. -
Производительность: В некоторых случаях ReentrantLock может работать эффективнее, особенно при высокой конкуренции потоков, но это зависит от реализации JVM.
-
Управление блокировкой: synchronized автоматически освобождает блокировку при выходе из блока кода, тогда как с ReentrantLock нужно явно вызывать
unlock(), что требует аккуратности, чтобы избежать дедлоков. -
Возможность справедливости: ReentrantLock можно создать с параметром справедливости, который гарантирует, что блокировка будет передаваться потокам в порядке их запроса, чего нельзя сделать с synchronized.
Пример использования ReentrantLock:
import java.util.concurrent.locks.ReentrantLock;
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// критическая секция
} finally {
lock.unlock();
}