synchronized — ключевое слово языка. ReentrantLock — класс из пакета java.util.concurrent.locks.synchronized может использоваться для блокировки методов или блоков кода. ReentrantLock блокирует только блоки кода через методы lock() и unlock().synchronized является примитивной формой блокировки, не имеет возможностей тонкой настройки. ReentrantLock предоставляет больше гибкости:
lockInterruptibly()).tryLock()).tryLock(long timeout, TimeUnit unit)).newCondition()).synchronized автоматически освобождает блокировку при выходе из блокированного блока кода (в том числе при исключениях). ReentrantLock требует явного вызова unlock() в блоке finally, чтобы избежать взаимоблокировки.ReentrantLock может быть выше при высокой конкуренции потоков по сравнению с synchronized (хотя в последних версиях Java различия могут быть незначительными).ReentrantLock поддерживает честный режим (fairness), при котором потоки получают блокировку в порядке запроса. synchronized не гарантирует честный режим.Пример использования ReentrantLock:
java
Пример использования synchronized:
java