当前位置: 首页 > news >正文

synchronized 和 ReentrantLock 的区别是什么?

synchronized 是 Java 关键字,属于 JVM 层面的内置隐式锁;ReentrantLock 是 java.util.concurrent.locks 包下的类,属于 API 层面的显式锁。它们的主要区别体现在使用方式、功能性、灵活性和底层实现上。

一句话概括:synchronized 简洁、自动,ReentrantLock 强大、灵活。在无需高级功能的场景下,优先推荐使用 synchronized;当需要可中断锁、超时获取、公平锁、多个条件变量等高级功能时,则必须使用 ReentrantLock

深度解析

使用方式与灵活性

  • synchronized: 无需手动释放锁。它的作用域是 代码块(需指定锁对象)或 实例方法/静态方法(锁对象分别是当前实例和 Class 对象)。锁的获取和释放由编译器生成的字节码指令(monitorenter/monitorexit)隐式管理。
// synchronized 代码块
public void syncMethod() {synchronized (this) { // 手动指定锁对象// 临界区}
}
// synchronized 方法
public synchronized void syncMethod() { // 锁是当前实例 this// 临界区
}
  • ReentrantLock: 必须 显式地调用 lock() 和 unlock() 方法,并且通常将 unlock() 置于 finally 块中以确保锁必然释放,防止死锁。这赋予了它更大的灵活性,但也增加了代码的复杂性。
ReentrantLock lock = new ReentrantLock();
public void reentrantLockMethod() {lock.lock(); // 必须显式获取try {// 临界区} finally {lock.unlock(); // 必须显式释放,且在finally中}
}

功能性对比

这是 ReentrantLock 优势最集中的地方。

特性synchronizedReentrantLock
公平性 非公平锁(无法指定) 可指定为公平或非公平锁(构造方法传入 true)。公平锁能减少线程饥饿,但吞吐量通常较低。
尝试非阻塞获取 不支持 支持 tryLock(),可立即返回是否成功。
可中断等待 等待锁时不可中断,会一直阻塞。 支持 lockInterruptibly(),等待锁的线程可被其他线程中断。
超时获取 不支持 支持 tryLock(long timeout, TimeUnit unit),可避免无限期等待。
条件变量 仅有一个隐式的等待/通知机制(Object.wait()/notify())。 可以创建多个 Condition 对象,实现更精细的线程间通信(如“生产者-消费者”模型)。

底层实现与性能

  • synchronized: 依赖 JVM 的 ObjectMonitor(对象监视器)实现。在 JDK 6 之后,JVM 团队对其进行了大量优化,如偏向锁、轻量级锁、锁消除、锁粗化、适应性自旋等。在低至中度竞争的场景下,其性能已经非常优秀,甚至与 ReentrantLock 相差无几。
  • ReentrantLock: 基于 AQS(AbstractQueuedSynchronizer) 实现。AQS 内部维护了一个 CLH 变体的双向队列来管理等待线程。其高级功能(如条件变量)正是基于 AQS 的灵活架构实现的。

最佳实践与常见误区

  1. 优先使用 synchronized: 由于其简洁性和 JVM 的持续优化,在大多数通用并发场景下,synchronized 是首选。它能减少代码错误(如忘记解锁),且性能足够好。
  2. 需要高级功能时再用 ReentrantLock: 当你的业务确实需要上述表格中的某个高级特性时,再选择 ReentrantLock。切忌为了用而用。
  3. 必须解锁在 finally 中: 使用 ReentrantLock 时,这是铁律,否则一旦临界区代码抛出异常,锁将永远无法释放。
  4. 避免误解性能: 不要再说“ReentrantLock 性能远高于 synchronized”,这个结论在 JDK 6 之后已经过时。性能差异高度依赖于具体场景(竞争激烈程度、锁持有时间等)。在极高竞争下,ReentrantLock 的可预测性可能更好。
http://www.jsqmd.com/news/538030/

相关文章:

  • 【另行征集中、英文期刊】中国公路建设行业协会沉管隧道分会技术交流大会暨第九届交通运输与土木建筑国际学术交流大会 (ITT CHCA TEC ISTTCA 2026)
  • ArcGIS应用(二):高效提取遥感影像多波段值的进阶技巧
  • WPF Button控件实战:从基础属性到高级命令绑定全解析(附完整代码示例)
  • Godot学习05 - 播放动画
  • 零零碎碎
  • OpenClaw多通道控制:nanobot镜像同时对接QQ与飞书实战
  • 英维思3623T TRICONEX 产品介绍
  • Windows Defender管理工具:完全掌控系统安全防护的高效解决方案
  • 三步搞定QQ音乐资源获取:终极免费音乐下载工具完整指南
  • 山东一卡通如何回收最划算 - 团团收购物卡回收
  • OpenClaw硬件适配:nanobot镜像在低配电脑上的优化运行
  • 5个高效技巧:如何用NsEmuTools专业管理NS模拟器
  • 安装软件出现无法访问msi
  • 专升本/高起专必读:云南学历提升机构那么多,为什么推荐博联教育? - 深度智识库
  • 2026年GEO优化服务商深度测评:从技术实力到行业适配,哪家更懂你的需求? - 品牌2025
  • JAVA重点基础、进阶知识及易错点总结(7)集合体系与 Collection 接口
  • 2026年GEO实战项目特训营性价比深度测评:从效果到口碑的4大机构解析 - 小白条111
  • ROS1/ROS2实战:手把手教你调通TEB局部规划器,让机器人丝滑避障
  • 易加增材IPO被终止:半年营收2.5亿 曾拟募资12亿
  • 挤塑板采购决策指南:四川5家优质供应商综合评估与选择建议 - 深度智识库
  • 揭秘OpenVSP:这款开源3D建模工具如何重塑飞机设计流程
  • [APM32F0] APM32F003常见烧录问题解决指南
  • 软件测试报告过期了怎么办?-第三方软件测试
  • LFM2.5-1.2B-Thinking-GGUF真实案例:某国产MCU厂商技术文档自动摘要准确率达92%
  • vLLM推理加速实战:在Windows笔记本跑通Qwen-0.6B模型的完整记录
  • 如何用ffmpegGUI简化视频处理:现代桌面应用的完整指南
  • 2026年江苏热门的商用直饮水机品牌推荐,靠谱的批量定制公司有哪些 - myqiye
  • AI辅助开发:让智能体分析日志,自动诊断并修复“服务睡眠”故障
  • OpenClaw+nanobot:智能家居控制中心方案
  • 获取一个地点天气数据