Следующий код:
synchronized(lock){
}
на самом деле не использует механику Lock
, вы просто используете встроенные функции синхронизации на Object
.В этом случае вы могли бы также использовать простой старый Object
.Преимущество объекта блокировки, расширяющего Object
, заключается в том, что он отображается в инструментах отладки с именем класса, а не просто в виде Object
, что более полезно при поиске тупиков.
См. здесь для Lock
API.
Преимущество Lock
заключается в том, что вы получаете больше возможностей, таких как возможность «попробовать» блокировку, а затем продолжить выполнение кода в случае сбоя,Кроме того, он имеет свойства, отличные от синхронизированного блока, потому что он не реентерабелен (поток не может удерживать несколько блокировок на одной и той же блокировке, а затем снять их).Если бы вы хотели что-то подобное, вы бы использовали ReentrantLock
.
У вас также есть блокировки кулера, такие как ReentrantReadWriteLock
, которые поддерживают несколько считывателей, но как только писатель блокирует это, никаких читателей нетразрешеныТам есть большая экосистема блокировки для различных типов приложений.