星海

并发 · 主观题 · 第 22 题

Java 后端开发面试 · 第 22 题

synchronized 和 ReentrantLock 有什么区别?各适合什么场景?

参考答案

1. 实现层面:synchronized 是 JVM 关键字,基于对象头和 monitor;ReentrantLock 是 JDK 的类,基于 AQS 和 CAS。
2. 释放:synchronized 由 JVM 自动释放(包括发生异常时);ReentrantLock 必须在 finally 里手动 unlock。
3. 功能:ReentrantLock 支持可中断地加锁、tryLock 超时、公平锁、多个 Condition;synchronized 都不支持,只有一个等待队列(wait/notify)。
4. 两者都可重入。JVM 对 synchronized 做了锁消除、锁粗化、自旋等优化,性能已经和 ReentrantLock 接近。
5. 选择:没有特殊需求时用 synchronized,代码简洁不易出错;需要超时、可中断、公平或多条件队列时用 ReentrantLock;读多写少可以考虑 ReentrantReadWriteLock 或 StampedLock。
6. 虚拟线程:JDK 21 中在 synchronized 内阻塞会钉住载体线程,当时推荐改用 ReentrantLock;JDK 24 起这个问题已解决。

解析

从实现、释放方式、功能、性能、选型五个方面作答。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。