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