Java随笔-锁
Java 中的锁可以从多个维度分类但核心演进脉络集中在 synchronized从 纯重量级锁到锁升级体系的优化以及 JUC 显式锁体系的成熟。下面按分类、演进、原理三层展开。一、Java 锁的宏观分类1. 按实现层面类型代表控制方隐式锁synchronizedJVM 自动管理进入/退出 monitorenter/monitorexit显式锁ReentrantLock、ReadWriteLock程序员手动lock()/unlock()2. 按竞争策略类型思想代表悲观锁先加锁再操作synchronized、ReentrantLock乐观锁先操作提交时 CAS 检查AtomicInteger、LongAdder3. 按特性公平/非公平是否按请求顺序分配锁可重入/不可重入同一线程能否多次获取同一把锁共享/独占读锁共享、写锁独占自旋/阻塞竞争时 CPU 空转等待 vs 线程挂起4. 按状态synchronized 核心演进的主线无锁 → 偏向锁 → 轻量级锁 → 重量级锁二、锁的演进史synchronized 的四代优化1. JDK 1.0 ~ 1.5纯重量级锁性能黑洞早期 synchronized 直接调用操作系统mutex互斥量线程阻塞 用户态 → 内核态切换线程唤醒 内核态 → 用户态切换即使单线程反复进入也要走完整内核流程当时 Java 并发性能被严重诟病直到 Doug Lea 推出 JUCjava.util.concurrent 包用 ReentrantLock CAS 绕过 JVM 锁。2. JDK 1.6锁升级体系JVM 团队反击JVM 团队发现大多数锁不仅不存在多线程竞争而且总是由同一线程多次获得。于是引入 锁升级Lock Coarsening/Elimination 之外的核心优化① 无锁Lock-Free对象初始状态或显式使用 Atomic 类依赖 CPU 的 cmpxchgCAS指令Mark Word 标志…| age:4 | biased_lock:0 | lock:01② 偏向锁Biased Locking场景只有一个线程访问同步块原理第一次获取锁时用 CAS 把线程 ID 写入对象头的 Mark Word。之后该线程进入同步块只需检查 Mark Word 里的线程 ID 是否是自己无需任何原子操作。撤销成本一旦有第二个线程尝试获取必须在安全点STW撤销偏向锁这个代价不小。现状JDK 15 废弃JEP 374JDK 18 默认关闭。现代硬件上收益变小撤销成本反而成为负担。③ 轻量级锁Lightweight Locking场景多线程交替执行竞争不激烈没有同时抢原理线程在自己的栈帧中创建 Lock Record然后用 CAS 把对象头的 Mark Word 替换为指向该 Lock Record 的指针。成功获得锁失败自旋默认 10 次JDK 1.6 后引入自适应自旋根据历史成功率动态调整次数优点线程不阻塞避免内核态切换缺点自旋消耗 CPU竞争激烈时自旋就是浪费④ 重量级锁Heavyweight Locking场景竞争激烈自旋失败原理锁膨胀inflate为 MonitorObjectMonitor对象头 Mark Word 指向 ObjectMonitor 地址未获得锁的线程进入 _EntryList 阻塞持有锁的线程执行完后从 _EntryList 唤醒一个竞争线程开销内核态切换但适合长时间持有锁的场景3. JDK 1.6 另外两项编译优化优化原理效果锁消除Lock Elimination逃逸分析发现锁对象不会被其他线程访问直接去掉同步局部变量StringBuffer的同步常被消除锁粗化Lock Coarsening相邻的同步块合并为一个更大的同步块减少反复加锁/解锁开销三、Mark Word 结构锁状态的载体对象头中的Mark Word是锁状态的存储载体。以64 位 JVM为例锁状态62 bitsbiased_lock (1 bit)lock (2 bits)无锁unused:25 hash:31 unused:1 age:4001偏向锁thread:54 epoch:2 unused:1 age:41101轻量级锁ptr_to_lock_record:62-00重量级锁ptr_to_monitor:62-10GC 标记ptr_to_cms_promoted_obj:62-11lock 字段2 bits biased_lock 字段1 bit共同标识当前锁状态。四、锁升级完整流程图对象创建 │ ▼ ┌─────────────┐ │ 无锁状态 │◄────────────────────────┐ │ (匿名可偏向) │ │ └──────┬──────┘ │ │ │ ▼ │ 线程A尝试获取 │ │ │ ▼ │ ┌─────────────┐ 线程A再次进入 │ │ 偏向锁状态 │◄──────────────────┐ │ │ Mark Word记录 │ │ │ │ 线程A ID │ │ │ └──────┬──────┘ │ │ │ │ │ ▼ 线程B尝试获取 │ │ 检查epoch/撤销 │ │ │ │ │ ▼ │ │ ┌─────────────┐ │ │ │ 轻量级锁 │ CAS成功 │ │ │ 自旋竞争 │───────────────────┘ │ └──────┬──────┘ │ │ │ ▼ 自旋失败/竞争激烈 │ 锁膨胀inflate │ │ │ ▼ │ ┌─────────────┐ 锁释放后 │ │ 重量级锁 │────────────────────────┘ │ ObjectMonitor│ └─────────────┘关键规则锁升级是单向的偏向锁 → 轻量级锁 → 重量级锁不能降级重量级锁释放后对象回到无锁状态下次竞争重新走升级流程偏向锁撤销后可能直接升级为轻量级锁也可能先回到无锁五、显式锁体系JUC 的补足synchronized 的升级体系是 JVM 自动优化的但灵活性不足。JUC 提供了更精细的控制1. ReentrantLock基于 AQSReentrantLocklocknewReentrantLock(true);// true公平锁lock.lock();try{// 临界区}finally{lock.unlock();}底层是 AQSAbstractQueuedSynchronizer通过 volatile int state CAS 双向链表管理队列支持公平/非公平、可中断lockInterruptibly、超时tryLock(timeout)、多条件变量Condition2. ReadWriteLock读锁共享锁多个线程可同时读写锁独占锁写时阻塞读写适合读多写少场景3. StampedLockJDK 8引入乐观读锁先读提交时验证版本号未被写则成功被写了再升级为悲观读性能比 ReadWriteLock 更高但使用复杂六、对比总结维度synchronizedReentrantLockCAS无锁实现层JVM字节码monitorenterAPIAQSCPU 指令锁升级✅ 支持偏向→轻量→重量❌ 直接 AQS 队列无锁无升级公平性非公平可选公平/非公平-可中断❌ 不支持✅lockInterruptibly-条件队列1 个wait/notify多个Condition-性能JDK 1.6 后接近 ReentrantLock略优极端竞争无竞争时最优使用难度低自动释放高需finally unlock高ABA 问题七、演进时间线版本锁相关演进JDK 1.0synchronized纯重量级锁性能差JDK 1.2引入Lock接口雏形但 synchronized 未优化JDK 1.5JUC 包正式发布ReentrantLock、Atomic、AQSJDK 1.6锁升级偏向/轻量/重量、锁消除、锁粗化、自适应自旋JDK 1.7G1 GC继续优化同步性能JDK 1.8引入StampedLock、LongAdder分段 CASJDK 15废弃偏向锁JEP 374现代并发模型下收益为负JDK 18默认关闭偏向锁未来可能彻底移除八、总结Java 锁的演进本质是能不动内核就不动内核从早期直接调用操作系统 mutex重量级到发现大多数锁无竞争后引入偏向锁零开销、轻量级锁CAS 自旋再到 JUC 用 AQS 把排队逻辑搬到用户态。最终趋势是偏向锁被淘汰轻量级锁 CAS AQS成为主流。

相关新闻

SpringBoot3+Vue3+MySQL安置房管理系统源码 前后端分离实战

SpringBoot3+Vue3+MySQL安置房管理系统源码 前后端分离实战

一、项目简介 安置房管理系统是一套基于 SpringBoot 3 Vue 3 前后端分离架构的综合管理平台,覆盖安置对象管理、房源管理、摇号分配、入住管理、费用收缴、报修维修、巡检记录、公告通知等核心业务环节。系统内置多角色权限体系,支持管理员、住户、维修…

2026/8/6 17:53:40 阅读更多 →
3步学会WindowResizer:终极窗口尺寸控制指南

3步学会WindowResizer:终极窗口尺寸控制指南

3步学会WindowResizer:终极窗口尺寸控制指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些固执的应用程序窗口尺寸而烦恼吗?WindowResizer这款…

2026/8/6 17:53:40 阅读更多 →
Windows激活终极指南:3分钟免费永久激活的完整解决方案

Windows激活终极指南:3分钟免费永久激活的完整解决方案

Windows激活终极指南:3分钟免费永久激活的完整解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 如果你曾经为Windows系统激活而烦恼,每次开机都看到"需要激活…

2026/8/6 17:53:40 阅读更多 →

最新新闻

3步解锁你的网易云音乐:NCM格式解密转换终极指南

3步解锁你的网易云音乐:NCM格式解密转换终极指南

3步解锁你的网易云音乐:NCM格式解密转换终极指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐下载的歌曲只能在特定客户端播放…

2026/8/7 3:47:11 阅读更多 →
EC200N-CN Cat.1模组从零上手:硬件连接、AT命令调试与网络通信实战

EC200N-CN Cat.1模组从零上手:硬件连接、AT命令调试与网络通信实战

1. 项目概述:从零上手EC200N-CN模组 最近在做一个物联网小项目,需要用到4G Cat.1通信模组,选来选去,最终敲定了移远通信的EC200N-CN。这玩意儿在物联网圈子里算是“国民级”的模组了,性价比高,资料也相对齐…

2026/8/7 3:47:11 阅读更多 →
蓝牙HFP三方通话AT命令实战:从协议解析到跨平台兼容性实现

蓝牙HFP三方通话AT命令实战:从协议解析到跨平台兼容性实现

1. 项目缘起:为什么需要关注HFP的三方通话命令?如果你是一名嵌入式音频开发工程师,或者正在从事车载蓝牙、蓝牙耳机、智能座舱相关的软件开发,那么“蓝牙HFP三方通话”这个功能点,大概率是你绕不开的一个坎。我最近在为…

2026/8/7 3:47:11 阅读更多 →
ArcGIS缓冲区分析实战:从坐标文件到精准外扩边界的完整指南

ArcGIS缓冲区分析实战:从坐标文件到精准外扩边界的完整指南

1. 项目概述:从边界到缓冲区的精准构建在地理信息处理的实际工作中,我们常常会遇到一个看似简单却至关重要的需求:如何将一个已知的、由坐标点序列定义的边界,向外(或向内)扩展一定的距离,从而生…

2026/8/7 3:47:11 阅读更多 →
检索策略大全:关键词检索vs向量检索vs混合检索,怎么选效果最好

检索策略大全:关键词检索vs向量检索vs混合检索,怎么选效果最好

检索策略大全,关键词检索vs向量检索vs混合检索 有了向量数据库和Embedding模型,接下来就是怎么搜了。 很多人做RAG,默认就用向量检索。其实检索方式不止这一种。关键词检索、向量检索、混合检索,各有各的适用场景。选对了检索方式…

2026/8/7 3:47:11 阅读更多 →
科技论文写作方法论:从战略规划到结构优化与学术规范

科技论文写作方法论:从战略规划到结构优化与学术规范

1. 项目概述:从一份“答案”到一套“方法”看到这个标题,很多同学可能会心一笑,或者心头一紧。一份名为“【如何写好科技论文】2024春季雨课堂期末答案”的资料,其表面价值似乎指向一个具体的、功利性的目标——通过某门课程的期末…

2026/8/7 3:46:10 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →