news 2026/4/27 12:56:25

Synchronized 与 ReentrantLock

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Synchronized 与 ReentrantLock

核心原则是:简单场景默认用synchronized,复杂并发场景才用ReentrantLock

为了帮你快速做出决策,我为你总结了以下选型指南:

🎯 优先使用synchronized的场景

90% 的常规开发场景中,直接使用synchronized都是最优解。

  • 代码简洁安全:它是 JVM 内置的隐式锁,进入同步块自动加锁,执行完或抛出异常自动释放,完全不用担心忘记释放锁导致死锁的问题。
  • 常规同步需求:只需要保证简单的互斥性(比如简单的计数器、共享资源读写),不需要任何高级特性。
  • 低并发或性能持平:得益于 JDK 1.6 之后的锁升级机制(偏向锁、轻量级锁等),在低并发甚至大多数高并发场景下,它的性能已经和ReentrantLock相差无几。

🔧 必须使用ReentrantLock的场景

当你需要更细粒度的控制,或者面临复杂的并发协作时,ReentrantLock才是“杀手锏”。如果你有以下任意一个需求,就必须选它:

  1. 需要尝试获取锁(避免死锁)
    使用tryLock()可以尝试非阻塞地获取锁,或者设置超时时间。如果在规定时间内拿不到锁,线程可以放弃等待去执行降级逻辑,从而有效避免死锁。
  2. 需要可中断的锁
    使用lockInterruptibly(),允许在等待锁的过程中响应中断。如果线程在等锁时被其他线程中断,它可以立刻停止等待并处理异常,而synchronized会一直傻等。
  3. 需要公平锁
    synchronized只能是非公平锁(允许插队,吞吐量大但可能导致某些线程饥饿)。ReentrantLock可以在构造时传入true开启公平锁,严格按照“先到先得”的顺序获取锁(适合对执行顺序有严格要求的任务调度系统)。
  4. 需要多条件精准唤醒
    这是ReentrantLock配合Condition的杀手锏。在复杂的生产者-消费者模型中,你可以创建多个Condition(比如notFullnotEmpty),精准唤醒特定条件的线程。而synchronizedwait/notify只能随机唤醒一个或全部唤醒,效率较低。

📊 核心差异速查表

对比维度synchronizedReentrantLock
底层实现JVM 层面(C++实现,基于 Monitor)JDK 层面(Java API,基于 AQS)
使用方式隐式自动加锁/释放,代码简洁必须手动lock()/unlock()(需在finally中释放)
锁的公平性仅支持非公平锁支持公平锁与非公平锁(默认非公平)
锁获取方式阻塞获取,不可中断,无超时支持超时获取(tryLock)、可中断获取(lockInterruptibly)
条件队列单条件队列(wait/notify支持多条件队列(Condition),可精准唤醒
性能表现JDK 1.6+ 后性能极佳,低竞争下甚至更优高竞争下表现稳定,非公平锁吞吐量高

💡 避坑提醒
如果你决定使用ReentrantLock,千万记得unlock()必须写在finally代码块中!否则一旦临界区代码抛出异常,锁将永远无法释放,直接导致系统死锁。

拓展

ReentrantLock 的“精准唤醒”是通过Condition(条件变量)来实现的。

在传统的synchronized中,一个对象的wait/notify只能对应一个等待队列,唤醒时只能随机唤醒一个或唤醒全部(notifyAll),这就像在广播里喊“谁符合条件谁起来干活”,效率较低且容易误伤。

ReentrantLock可以绑定多个Condition,就像给不同工种的工人分配了专属的休息室。当需要某个工种的工人干活时,可以直接去对应的休息室精准叫人,互不干扰。

下面我为你演示两个经典的精准唤醒场景:

🎯 场景一:生产者-消费者模型(多条件队列)

在这个模型中,生产者只关心“队列是否已满”,消费者只关心“队列是否为空”。使用两个Condition可以实现精准调度:

importjava.util.LinkedList;importjava.util.Queue;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;publicclassProducerConsumerDemo{private
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 12:55:41

MirrorCaster终极指南:3步实现零延迟Android投屏

MirrorCaster终极指南:3步实现零延迟Android投屏 【免费下载链接】MirrorCaster 开源、高效、低延迟的Android投屏工具 项目地址: https://gitcode.com/gh_mirrors/mi/MirrorCaster 还在为手机投屏到电脑时的卡顿和延迟而烦恼吗?无论是游戏直播、…

作者头像 李华
网站建设 2026/4/27 12:54:24

终极OBS-VST插件指南:免费提升直播音频质量的完整方法

终极OBS-VST插件指南:免费提升直播音频质量的完整方法 【免费下载链接】obs-vst Use VST plugins in OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-vst OBS-VST插件是开源音频处理工具,让你能在OBS Studio中直接使用VST 2.x音频插件作为…

作者头像 李华
网站建设 2026/4/27 12:54:23

5分钟掌握TranslucentTB:让Windows任务栏透明化的终极美化指南

5分钟掌握TranslucentTB:让Windows任务栏透明化的终极美化指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了W…

作者头像 李华
网站建设 2026/4/27 12:52:21

Pearcleaner:让macOS重获新生的智能清理伙伴

Pearcleaner:让macOS重获新生的智能清理伙伴 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾发现,即使删除了macOS上的应用程…

作者头像 李华
网站建设 2026/4/27 12:52:20

拆解GM/T 0130:SM2无证书公钥机制里的‘三块碎片’与专利风险提示

GM/T 0130深度解析:SM2无证书公钥机制的三段式密钥生成与专利风险应对 在密码学领域,密钥管理一直是安全体系中最具挑战性的环节之一。传统PKI体系依赖数字证书绑定身份与公钥,而基于标识的密码系统(IBC)则面临密钥托管…

作者头像 李华