ReentrantLock
решает те же задачи, что и блок synchronized. Поток висит на вызове метода lock()
в ожидании своей очереди занять этот объект. Владеть локом, как и находиться внутри блока synchronized
может только один поток одновременно. unlock()
, подобно выходу из блока синхронизации, освобождает объект-монитор для других потоков.В отличие от блока синхронизации,
ReentrantLock
дает расширенный интерфейс для получения информации о состоянии блокировки. Методы лока позволяют еще до блокировки узнать, занят ли он сейчас, сколько потоков ждут его в очереди, сколько раз подряд текущий поток завладел им.Шире и возможные режимы блокировки. Кроме обычного ожидающего
lock()
, вариант tryLock()
с параметром ожидает своей очереди только заданное время, а без параметра – вообще не ждет, а только захватывает свободный лок.Еще одно отличие – свойство
fair
. Лок с этим свойством обеспечивает «справедливость» очереди: пришедший раньше поток захватывает объект раньше. Блок synchronized
не дает никаких гарантий порядка.