news 2026/8/28 22:06:31

Java 各类锁对比・诗意化记忆

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 各类锁对比・诗意化记忆

偏向锁、轻量级锁、重量级锁、synchronized、Lock、ReentrantLock、读写锁、自旋锁、乐观悲观锁,古风记忆,适配面试。

总起

并发多线程争疆场,资源抢夺起刀枪。 锁分乐观与悲观,轻重偏向各行藏。 隐显两套把门户,自旋忙等或眠藏。 取舍看清场景事,莫教死锁困四方。

一、悲观锁 vs 乐观锁

plaintext

悲观预设人来抢,上锁拒客守仓墙。 synchronized、ReentrantLock 归此壤。 乐观不信人相攘,版本号上辨兴亡。 冲突再做重试计,不加真锁性飞扬。 CAS为刃行其事,版本戳记辨沧桑。

记忆:

  • 悲观锁:默认一定会竞争,先上锁再干活;
  • 乐观锁:默认没人抢,不加锁,CAS / 版本号检测冲突,失败重试。

二、synchronized(内置隐式锁)锁升级四态

无锁 → 偏向锁 → 轻量级锁 (自旋) → 重量级锁,只能升级,不能降级

plaintext

初来无锁本寻常,单线程启偏向章。 偏爱此线专相守,省去加锁往复忙。 多线相争冲突起,偏向褪去换轻装。 自旋循环空轮转,不肯休眠待曙光。 自旋耗尽CPU量,竞争激烈换重疆。 向OS借互斥量,线程阻塞入眠乡。 升级单向无归路,一旦沉渊难复扬。
  • 无锁:无竞争
  • 偏向锁:单线程优先,消除 CAS 开销
  • 轻量级锁:多线程交替,自旋,不阻塞,耗 CPU
  • 重量级锁:内核互斥锁,线程阻塞挂起,耗上下文切换

口诀:单偏,交轻,争重重;只升不降不可逆

三、synchronized vs ReentrantLock

plaintext

synchronized隐式章,jvm之内铸铜墙。 自动上锁自动放,异常解锁不慌张。 不可中断非公平,功能朴素少锋芒。 ReentrantLock显式枪,手动开闭要谨详。 可中断来可公平,超时等待计时长。 条件队列多等待,功能繁复力刚强。 锁忘释放生危祸,finally内把锁偿。

表格

要点诗意提炼
synchronized:隐式、自动释放、不可中断、非公平、JVM 管控
ReentrantLock:显式 lock/unlock,finally 释放;支持公平 / 非公平、可中断、超时、Condition

四、读写锁 ReentrantReadWriteLock

plaintext

读多写少别匆忙,读写分锁各分疆。 读锁共享千客访,写锁独占守高墙。 读可同来写独往,写来读客尽潜藏。 警惕写锁饥饿患,久读无写祸根藏。

记忆:读共享、写互斥;适合读多写少;会写饥饿。

五、自旋锁

plaintext

自旋不肯入眠床,循环轮询盼锁光。 少去切换上下文,CPU消耗暗自伤。 竞争微弱方可用,激烈场景不可扬。

不阻塞,空循环等锁;竞争大 CPU 暴涨。

六、可重入锁

plaintext

同线再入旧锁堂,重入不把自身伤。 计数增减知进退,释放匹配莫相忘。 syn与Reentrant,二者皆具此所长。

同一个线程可以多次获取同一把锁,计数器加减。

七、公平锁 & 非公平锁

plaintext

公平排队依次上,先来先得不越墙。 吞吐平平秩序稳。 非公闯锁不排岗,抢占先机意气扬。 吞吐量高是长处,线程饥饿暗中藏。 synchronized非公相,Lock可择两规章。
  • 公平:排队,FIFO,吞吐低
  • 非公平:抢锁,不排队,吞吐高,可能饥饿

八、死锁四句

plaintext

互斥占有不释放,请求保持不肯降。 不可剥夺无退让,循环等待结成网。 四者齐聚死锁酿。

死锁四大条件:互斥、请求并持有、不可剥夺、循环等待。

完整背诵七言诗

plaintext

并发争访起仓皇,乐观悲观两阵场。 悲观先锁防侵扰,乐观CAS辨兴亡。 syn隐锁jvm藏,四级升阶不可逆。 单线程处偏向启,交替相争轻量扬。 自旋耗尽竞争烈,重量级锁入眠乡。 ReentrantLock显锋芒,手动开闭要提防。 可中断还可超时,公平队列可裁量。 finally中释枷锁,遗忘释放祸难防。 读写分锁分疆场,读共写独理昭彰。 读多写少宜使用,写锁饥饿要提防。 自旋轮询不眠床,竞争微弱性能强。 重入计数同线进,公平非公细思量。 互斥持守难夺让,循环等待死锁殇。 选锁要看场景事,没有一锁胜八方。

极简面试速记口诀

乐观 CAS,悲观上锁; syn 四态:无‑偏‑轻‑重,只升不降; syn 隐自动,Lock 显手动;可中断、公平、超时 Lock 强; 读共享,写独占,读写锁适配读多场景; 自旋耗 CPU,重入计数扛; 公平排队,非公抢占;四凑齐全死锁酿。

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

C# 工业设备通讯系列(持续更新中...)

文章目录 C# 工业设备通讯系列技术博文(持续更新...)第一篇:【C# 工业通讯】封装一个健壮的 TCP Socket 客户端基类(心跳与异常处理) 核心痛点解决方案:通用客户端基类设计关键技术点:核心代码实…

作者头像 李华
网站建设 2026/8/28 22:02:30

MATLAB预测模型实战:从灰色预测到神经网络,掌握四大核心算法

1. 从“猜”到“算”:预测模型到底在做什么? 每次看到“预测”两个字,很多人第一反应是“算命”或者“瞎猜”。尤其是在数学建模竞赛里,新手拿到一个预测类题目,比如“预测未来五年的城市用电量”、“估计下个月某商品…

作者头像 李华
网站建设 2026/8/28 22:02:28

C++11 std::function与std::bind:可调用对象封装与适配实战

1. 从“函数对象”到“可调用对象”:C11的范式跃迁如果你是从C98/03时代一路走过来的老手,肯定对“仿函数”(Functor)这个概念不陌生。那时候,想让一个东西像函数一样被调用,最正统的做法就是定义一个类&am…

作者头像 李华
网站建设 2026/8/28 22:00:26

蓝桥杯算法题解析:状态压缩DP在网格计数问题中的应用

1. 从一道蓝桥杯算法题看“绘制地图”的抽象与实现 最近在整理蓝桥杯的历年练习题,翻到了ALGO-380这道名为“绘制地图”的题目。说实话,第一次看到这个标题,我脑海里浮现的是各种图形库、画布操作,甚至想到了游戏开发里的地图编辑…

作者头像 李华
网站建设 2026/8/28 21:56:36

Hadoop Reduce OOM 真实排查案例(Hive On MapReduce)

本质:脏数据 → 数据倾斜 → OOM业务背景:用户行为日志每日离线跑批,Hive 执行 group by user_id 统计用户行为次数。每日跑批,某天作业突然失败,Reduce 任务 OOM,绝大多数 task 很快跑完,仅 1 …

作者头像 李华
网站建设 2026/8/28 21:54:34

视频字幕怎么提取?2026年5种实用方法,没字幕也能自动转文字

看视频最烦的就是:明明只想快速知道讲了什么,却得把十几二十分钟完整看完。尤其是做内容的人,拆同行视频、整理选题素材,经常需要先把字幕或文案弄出来扫一眼。 这事现在已经挺好解决了:视频本身有字幕,可以…

作者头像 李华