В чем разница между ReentrantLock и synchronized

«В чем разница между ReentrantLock и synchronized» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ReentrantLock и synchronized оба обеспечивают потокобезопасность, но с разными подходами:

  1. Гибкость
    ReentrantLock позволяет явно блокировать и разблокировать (lock(), unlock()), поддерживает таймауты (tryLock(timeout)), честность (fairness) и условия (Condition). synchronized — автоматический, без гибкости.

  2. Производительность
    В Java 5+ ReentrantLock может быть быстрее в высококонкурентных сценариях. synchronized оптимизирован JVM (биас-локи, тонкие блокировки).

  3. Читаемость
    synchronized лаконичнее, встроен в язык. ReentrantLock требует ручного управления.

Пример:

// synchronized
fun synchronizedMethod() {
    synchronized(this) {
        // critical section
    }
}

// ReentrantLock
val lock = ReentrantLock()
fun lockMethod() {
    lock.lock()
    try {
        // critical section
    } finally {
        lock.unlock()
    }
}