Ответ
ReentrantLock и synchronized оба обеспечивают потокобезопасность, но с разными подходами:
-
Гибкость
ReentrantLockпозволяет явно блокировать и разблокировать (lock(),unlock()), поддерживает таймауты (tryLock(timeout)), честность (fairness) и условия (Condition).synchronized— автоматический, без гибкости. -
Производительность
В Java 5+ReentrantLockможет быть быстрее в высококонкурентных сценариях.synchronizedоптимизирован JVM (биас-локи, тонкие блокировки). -
Читаемость
synchronizedлаконичнее, встроен в язык.ReentrantLockтребует ручного управления.
Пример:
// synchronized
fun synchronizedMethod() {
synchronized(this) {
// critical section
}
}
// ReentrantLock
val lock = ReentrantLock()
fun lockMethod() {
lock.lock()
try {
// critical section
} finally {
lock.unlock()
}
}