在Java中ReentrantLock和synchronized有哪些不同_Java显式锁与内置锁对比解析-java教程

ReentrantLock需手动unlock且必须用try/finally确保释放,synchronized由JVM自动释放;前者支持中断等待、公平锁和多个Condition,后者不支持。

ReentrantLock 必须手动 unlock,synchronized 不用管释放

这是最直接、最容易出问题的区别。用 synchronized 时,JVM 在方法退出或异常抛出后自动释放锁;而 ReentrantLock 必须显式调用 unlock(),否则锁永远不释放,其他线程会一直阻塞——这不是“可能出错”,是“一定会卡死”。

  • 正确写法必须套 try/finally:先 lock.lock(),再在 finally 块里调用 lock.unlock()
  • 如果写成 if 判断后才 lock(),但忘了在所有分支里都 unlock(),就埋下死锁隐患
  • 不能在 catch 中提前 return 却跳过 unlock() —— 只有 finally 是安全的落点

等待锁时能否被中断?synchronized 不行,ReentrantLock 可以

当线程 A 持有锁很久(比如 IO 卡住、逻辑阻塞),线程 B 在等锁,这时如果想让 B 主动放弃等待去做别的事(比如响应超时、关闭请求),synchronized 完全做不到;而 ReentrantLock 提供了 lockInterruptibly()。

  • lockInterruptibly() 被中断时会抛 InterruptedException,你可以捕获并清理资源、返回错误或切换策略
  • synchronized 下线程一旦进入阻塞等待状态,只能等锁释放,无法被外部打断
  • 这个能力在定时任务、RPC 超时控制、服务优雅停机等场景中非常关键

公平性可选 vs 固定非公平:ReentrantLock 能按排队顺序给锁

synchronized 总是非公平的——新来的线程可能插队抢到锁,老老实实排队的线程反而更慢;而 ReentrantLock 允许构造时传 true 启用公平模式:new ReentrantLock(true)。

  • 公平锁保证“先来先得”,适合对响应时间一致性要求高的场景(如金融交易指令排序)
  • 但公平锁性能通常比非公平锁差,因为要维护等待队列、额外 CAS 开销,高并发下吞吐下降明显
  • 默认构造(new ReentrantLock())是非公平的,行为和 synchronized 接近,这也是它日常性能不输的原因之一

一个锁配多个 Condition,synchronized 只能 wait/notifyAll

synchronized 的线程协作只能靠对象的 wait()/notify()/notifyAll(),但它们共用同一组等待队列,唤醒是“全量”或“随机一个”,没法区分条件类型;ReentrantLock 可通过 lock.newCondition() 创建多个独立 Condition 实例。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java中ReentrantLock和synchronized有哪些不同_Java显式锁与内置锁对比解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4022896+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4022896+
  • 本周更新: 0+
  • 最后更新: 2026-03-16