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

从互斥锁到无锁,Java 20年并发安全进化史

Java自1996年诞生以来其并发安全方面演进史就是一部从悲观互斥向乐观并行持续进化的历史。本文将沿着JDK版本发布的时间线梳理Java在解决线程安全问题时在锁机制、同步工具以及无锁算法上的关键变革。第一章混沌初开——JDK 1.0的原始线程模型1996年1996年1月JDK 1.0的发布奠定了Java最基础的线程模型。这个版本虽然功能原始但确立了一个具有传承性的设计——Java采用了协作式的线程通信方式。1.1 基础原语synchronized与wait/notify从第一个版本开始Java就引入了synchronized关键字作为内置锁Intrinsic Lock以及与之配套的wait()/notify()方法进行线程间通信。其设计核心非常简洁非静态方法使用synchronized修饰相当于锁住当前实例对象synchronized(this)。静态方法使用synchronized修饰相当于锁住该类的Class对象synchronized(XXX.class)。这是Java并发安全的起点——悲观锁思想的体现线程进入同步块前必须获得锁其他线程只能阻塞等待。在当时的技术背景下这种设计简单直接足以应对基础的多线程需求。1.2 早期设计的遗憾被废弃的暴力方法JDK 1.0初期还提供了stop()、suspend()和resume()三个方法。但由于它们本质上是不安全的——stop()直接终止线程会导致对象状态被破坏suspend()挂起线程时持有锁极易引发死锁——这些方法在JDK 1.2中就被正式废弃了。这一事件给Java开发者上了一课并发控制不能靠暴力中断而需要线程间的自觉配合。第二章理论奠基——JDK 1.2到1.4的修修补补1998-2002年在Java诞生的前六年开发者们饱受并发问题的困扰却往往归咎于代码逻辑而忽视了更深层的原因Java内存模型JMM的定义存在缺陷。2.1 可见性难题早期的JMM缺乏严谨的先行发生happens-before规则。一个线程修改了共享变量另一个线程可能永远看不到这个修改这就是可见性问题。当时volatile关键字虽然被设计用来解决这个问题但在旧的JMM下volatile的语义并不足够强不能完全解决这个问题。2.2 民间力量的酝酿Doug Lea的贡献在这一时期并发编程领域的泰斗Doug Lea开始撰写一系列并发工具类包括后来成为JUC核心的ReentrantLock、ConcurrentHashMap等。这些代码虽然没有被纳入JDK但其设计思想和实现方案为后来的标准化奠定了基础。这个时期的Java处于一个尴尬的境地硬件已经进入多核时代但语言层面的并发模型还停留在单核时代。第三章革命前夜——JDK 1.5的里程碑式突破2004年2004年JDK 1.5即Java 5的发布堪称Java并发编程史上最重要的里程碑。这一年JSR 133规范为Java带来了全新的内存模型JSR 166引入了划时代的java.util.concurrent包。3.1 JSR 133的救赎内存模型的重新定义JSR 133重新定义了volatile和synchronized的语义明确了happens-before关系对一个volatile变量的写操作happens-before于后续对这个变量的读操作。这意味着只要写入volatile变量就相当于向内存发出刷新信号读取volatile变量则相当于从内存中加载最新值。这一修订为后来高性能并发工具的发展扫清了理论障碍。3.2 JSR 166的降临JUC包的诞生由Doug Lea主导的JSR 166专家组正式将一系列并发工具纳入JDK标准库包括显式锁ReentrantLock、ReadWriteLock同步器Semaphore、CountDownLatch、CyclicBarrier并发容器ConcurrentHashMap、CopyOnWriteArrayList线程池ThreadPoolExecutor、Executors3.3 CAS的正式登场原子变量类的革命JDK 1.5最具有前瞻性的设计是引入了java.util.concurrent.atomic包提供了AtomicInteger、AtomicLong、AtomicReference等一系列原子类。这些类的底层实现正是CASCompare-And-Swap比较并交换——一种源自硬件层面的乐观并发控制技术。3.3.1 硬件级的乐观锁CAS是一种乐观锁策略。它包含三个操作数内存位置V、期望值A、新值B。只有当V的值等于A时才将V更新为B且整个操作是原子的。CAS依赖于现代CPU提供的特定指令如x86架构的cmpxchg由硬件保证其原子性避免了用户态锁的介入。它的核心思想是假设没有冲突能改就改如果改的时候发现被动了那就重试。3.3.2 无锁编程的实践以AtomicInteger为例其incrementAndGet()方法的内部实现是一个典型的CAS循环publicfinalintincrementAndGet(){for(;;){intcurrentget();intnextcurrent1;if(compareAndSet(current,next))returnnext;}}这种循环重试的模式就是无锁编程的雏形。虽然它会占用CPU循环但在低冲突场景下远比挂起线程高效。这正是乐观锁思想的精髓用CPU周期换取线程的存活用自旋替代阻塞。3.3.3 ReentrantLock的CAS内核值得注意的是即便是ReentrantLock这样的显式锁其底层实现也大量依赖CAS。AbstractQueuedSynchronizerAQS作为JUC锁的基石其核心状态state就是一个被CAS操作的volatile变量。获取锁、释放锁的成败都取决于能否通过CAS成功修改这个状态。可以说CAS是JUC框架的发动机。3.4 UnsafeCAS的底层支撑JDK 1.5中CAS的广泛应用离不开一个核心底层工具类——sun.misc.Unsafe。该类提供了直接操作内存、执行原子操作的底层能力是Java并发工具如原子类、AQS实现的核心依赖也是CAS操作能够落地的关键。Unsafe的设计初衷是为JDK内部类如java.util.concurrent.atomic、java.util.concurrent.locks提供底层支持并非面向普通开发者。它的核心能力包括原子操作提供compareAndSwapInt、compareAndSwapLong、compareAndSwapObject等方法直接封装CPU的CAS指令是AtomicInteger等原子类的底层实现。例如AtomicInteger的compareAndSet方法本质就是调用Unsafe的compareAndSwapInt方法。内存操作可直接分配、释放内存操作对象的字段无需通过反射突破了Java的安全限制能直接操作堆外内存为高性能并发提供了可能。线程调度提供park和unpark方法用于线程的挂起和唤醒是AQS实现线程等待队列的核心底层方法。需要注意的是Unsafe具有极高的危险性它绕过了Java的安全检查直接操作内存和底层资源一旦使用不当极易引发内存泄漏、数据错乱甚至JVM崩溃。因此JDK官方一直未将其公开暴露普通开发者无法直接通过正常方式获取其实例需通过反射且该类在后续JDK版本中逐渐被更安全的API替代。3.5 JDK 1.5的历史定位JDK 1.5标志着Java并发编程从单一路径走向多元化并发模型代表技术适用场景悲观阻塞synchronized简单同步低并发显式锁ReentrantLock需要超时、中断等高级功能无锁并发Atomic*类简单计数器状态标志并发容器ConcurrentHashMap高并发数据结构开发者第一次拥有了选择权可以根据场景在互斥阻塞和乐观自旋之间做出权衡。第四章双雄并立——JDK 1.6的锁优化与性能之争2006年就在开发者们逐渐转向ReentrantLock和原子类时JVM团队没有放弃synchronized。从JDK 1.6开始HotSpot VM对synchronized进行了大刀阔斧的优化引入了锁升级机制使其性能在某些场景下甚至超越了ReentrantLock。4.1 对象头与Mark Wordsynchronized的优化依赖于对象在内存中的布局。每个Java对象的对象头中都有一块称为Mark Word的区域它记录了对象的哈希码、GC年龄以及锁状态标志。锁升级的过程就是Mark Word中标志位变化的过程。4.2 锁升级路径无锁 → 偏向锁 → 轻量级锁 → 重量级锁偏向锁Biased Locking针对锁大多由同一线程获得的场景。当线程第一次进入同步块JVM会将Mark Word中的线程ID设为当前线程。此后该线程再次进入时只需比对ID几乎零开销。如果其他线程来竞争偏向锁即撤销。轻量级锁Lightweight Locking当竞争出现时锁升级为轻量级锁。线程会在自己的栈帧中创建锁记录Lock Record通过CAS自旋尝试修改Mark Word指向自己的锁记录。注意这里的CAS正是JDK 1.5引入的原子操作在JVM内部的运用——JVM自身也开始用CAS优化锁的获取。重量级锁Heavyweight Locking当自旋超过一定阈值或等待线程数过多锁会膨胀为重量级锁。此时Mark Word指向一个操作系统级别的互斥量mutex。未获取锁的线程进入阻塞队列由操作系统调度涉及用户态与内核态的切换开销最大。4.3 CAS的双重角色从这个阶段开始CAS在Java并发体系中扮演着双重角色应用层面开发者通过AtomicInteger等类直接使用CAS实现无锁并发。JVM层面虚拟机内部用CAS优化synchronized的轻量级锁获取用CAS实现偏向锁的撤销。4.4 两种路径的对比到了JDK 1.6Java实际上形成了两条并行的并发技术路线技术路线代表核心机制优势内置锁路线synchronized锁升级 JVM级CAS简单易用自动优化显式锁路线ReentrantLockAtomic*应用级CAS 自旋灵活可控功能丰富第五章巅峰对决——JDK 1.8的革命性重构2014年JDK 1.8的发布标志着Java并发技术走向成熟。这一年ConcurrentHashMap经历了革命性重构将CAS和synchronized的配合发挥到了极致。5.1 ConcurrentHashMap的两代变迁JDK 7时代分段锁Segment在JDK 7及之前ConcurrentHashMap采用了分段锁设计。它将整个哈希表分成多个Segment段每个Segment独立持有一把锁。当多个线程操作不同Segment中的数据时可以真正并行执行大大提高了并发度。但是分段锁也存在固有缺陷内存开销大需要维护多个锁段数量固定扩容困难且某些操作如size()需要依次锁住所有段性能较差。JDK 8的革新synchronized CASJDK 8完全摒弃了分段锁采用了更精细的设计数据结构采用Node数组 链表/红黑树。并发控制写入数据时根据桶位bucket的状态采取不同策略如果桶位为空则通过CAS直接插入节点——这是无锁并发的实践。如果桶位非空则对链表头节点或树根节点使用synchronized加锁——这是细粒度锁的应用。这种设计实现了锁粒度细化到单个桶且巧妙利用了synchronized在JDK 8中已优化的性能。写线程只需锁住自己正在操作的桶其他桶的访问完全不受影响。这是CAS局部锁的完美结合也是两条并发技术路线从竞争走向融合的标志。5.2 LongAdder的登场JDK 8还引入了LongAdder这是对AtomicLong的进一步优化。在高并发场景下大量线程同时CAS竞争同一个变量会导致大量重试和缓存抖动。LongAdder的核心思想是分而治之它将一个计数变量拆分成多个单元Cell每个线程只更新自己对应的单元最后求和时再汇总。这实际上是将CAS的竞争从单点分散到多点进一步提升了吞吐量。5.3 JDK 8的历史地位JDK 8标志着Java并发技术走向成熟锁不再是唯一选择大量场景可以用无锁数据结构替代锁。悲观与乐观的融合ConcurrentHashMap证明了CAS和synchronized可以协同工作。细粒度成为主流无论是锁粒度还是数据分片粒度都走向精细化。第六章未来已来——JDK 9到21的持续演进2017-2023年从JDK 9开始Java进入模块化和快速迭代的时代。并发领域虽然没有革命性变革但持续进行着优化和调整。6.1 偏向锁的谢幕JDK 15中偏向锁被标记为废弃JDK 21中偏向锁默认被禁用。原因在于在高并发应用中锁通常由不同线程竞争偏向锁的撤销成本反而成为负担。JVM团队根据实际场景数据做出了务实的选择——这体现了并发技术演进中实践检验真理的原则。6.2 VarHandle标准化的内存访问工具JDK 9引入了java.lang.invoke.VarHandle作为Unsafe的标准化替代方案解决了Unsafe安全性差、API不规范的问题同时保留了底层内存操作和原子操作的能力成为Java并发底层编程的新选择。VarHandle的核心优势的在于安全、标准化、高效其核心能力与Unsafe对应但更具规范性原子操作支持提供compareAndSet、getAndAdd、getAndSet等原子方法与Unsafe的原子操作功能一致且支持更丰富的类型包括基本类型和引用类型底层同样依赖CPU的CAS指令性能与Unsafe相当。内存语义控制支持通过memoryOrder参数指定内存访问顺序如volatile、acquire、release等灵活控制内存可见性和有序性比volatile关键字更精细也比Unsafe的操作更规范。安全性提升VarHandle是公开的标准化API无需通过反射获取且操作被严格限制在合法范围内避免了Unsafe直接操作内存可能引发的风险同时提供了类型安全检查减少了编程错误。替代Unsafe的核心场景在JDK后续版本中大量原依赖Unsafe的类如原子类、并发容器逐渐迁移到VarHandle实现例如AtomicInteger的部分方法在JDK 9中已通过VarHandle实现进一步提升了代码的安全性和可维护性。VarHandle的出现标志着Java底层并发工具的规范化演进——不再依赖非公开的危险API而是通过标准化接口提供底层能力兼顾了高性能和安全性为后续并发技术的优化奠定了基础。结语纵观这二十多年的发展Java并发安全的演进从最初粗暴的全局锁到精细化的读写锁再到基于CAS的无锁并发每一次技术跃迁都是为了在保证线程安全的前提下将硬件的并行效能发挥到极致。

相关文章:

从互斥锁到无锁,Java 20年并发安全进化史

Java自1996年诞生以来,其并发安全方面演进史,就是一部从"悲观互斥"向"乐观并行"持续进化的历史。本文将沿着JDK版本发布的时间线,梳理Java在解决线程安全问题时,在锁机制、同步工具以及无锁算法上的关键变革。…...

OpenClaw新手入门宝典

摘要:本宝典系统讲解OpenClaw(开源AI智能体平台)的安装部署、功能应用与Skill开发,助力新手快速上手。作为能"动手执行任务"的AI助手,它支持文件管理、网页操作等核心功能,可接入飞书、微信等多渠…...

三星宣布730亿美元扩产AI芯片;海底捞人形机器人表演异常引发安全讨论;国星宇航完成全球首次太空算力操控地面机器人

1. VLMgineer让大模型自主设计工具牛喀网获悉,宾夕法尼亚大学的研究者提出VLMgineer框架,让机器人自主设计工具并学会使用,该工作已被ICLR2026接收。该框架是端到端由VLM驱动,从理解任务场景、构思工具几何到规划使用动作&#xf…...

嵌入式硬件中假芯片的识别与防御设计

1. 假芯片现象的技术本质与工程应对半导体供应链中的“假芯片”并非一个模糊的商业概念,而是一类具有明确物理特征、可复现检测路径、且在硬件设计阶段即需系统性防范的工程问题。当工程师在调试一块GD32F103C8T6开发板时发现待机电流异常高达200mA,或在…...

一个Openclaw多Agent自动化协作情况下,记忆丢失问题解析

核心概述:一个Openclaw多Agent,如果想实现各Agent自动化沟通,最简单的办法是设置一个主Agent,由主Agent使用 sessions_spawn 派发任务给其他Agent。经过一段时间测试,发现这种模式经常出现记忆不同步的问题&#xff0c…...

OpenClaw故障排查大全:GLM-4.7-Flash接口超时解决方案

OpenClaw故障排查大全:GLM-4.7-Flash接口超时解决方案 1. 问题背景与现象描述 上周在尝试用OpenClaw对接本地部署的GLM-4.7-Flash模型时,遇到了令人头疼的接口超时问题。具体表现为:当处理超过2000字的长文本时,系统频繁返回502…...

最新微信在线AI客服系统源码独家支持多媒体+人工客服转接

温馨提示:文末有资源获取方式近日,一款基于PHP原生开发的微信AI智能在线客服系统解决方案正式亮相,深度集成企业微信生态,为企业提供724小时智能值守服务。该系统突破传统文本客服的单一模式,独家支持多媒体交互与人工…...

Sikuli脚本中的控制语句

SikuliX 的脚本语言其实是 Jython(Python语法),所以 判断、循环、函数、异常处理等控制结构 全部使用 Python 语法。一、判断语句(if)语法说明示例if条件判断if exists("ok.png"):elif否则如果elif exists(&…...

daily_stock_analysis镜像企业集成:通过API对接内部OA系统实现报告自动推送

daily_stock_analysis镜像企业集成:通过API对接内部OA系统实现报告自动推送 想象一下这个场景:每天早上9点,公司高管和投资部门的同事打开企业OA系统,一份结构清晰、重点突出的股票分析报告已经静静地躺在他们的待办事项或内部公…...

【黑马点评学习笔记 | 实战篇 】| 8-好友关注

Bug如山勤为径,代码似海苦作舟。友友们好,这里是苦瓜大王。今天学习的是黑马点评项目实战篇——好友关注部分的学习,今天也是相对轻松的章节!今天我们将完成好友关注功能。笔记如下,后续会一直更新黑马点评学习过程中的…...

户籍制度捆绑资源下留守儿童问题对人口结构的长效影响

一、劳务输出省份留守儿童问题现状分析 1.1 户籍壁垒下公共资源配置失衡现状 户籍制度与城市公共服务的捆绑,构成了流动人口子女随迁的刚性约束机制,是留守儿童问题产生的结构性根源。尽管2010-2020年间我国流动人口增加了1.54亿人,城镇化进…...

【高精度气象】2026别再只问“天气准不准”:真正拉开收益差距的,是把预报接进交易、调度和运维

很多新能源企业到了 2026 年,仍然习惯把问题问成一句话:明天的天气到底准不准?这个问题当然重要,但已经不够了。因为今天的行业竞争,早就不是“谁把风速、辐照度报得更像天气软件”,而是谁能把气象预报真正…...

1%的预测精度提升,在现货市场值多少钱?基于100MW电站的年度收益敏感性分析

当电力现货市场进入“分钟级博弈”,功率预测已不是技术问题,而是算账问题。2026年,对于新能源电站而言,一个根本性的变化正在发生。过去,功率预测是“合规成本”——做得好不被罚,做不好被罚钱。今天&#…...

2026功率预测生死局:MKAN多尺度网络如何将光伏预测误差斩落马下?

当考核规则趋严,传统AI模型集体失灵,一种名为MKAN的新型网络正在改写游戏规则。2026年的春天,对于新能源电站的运营者而言,注定不太平。今年以来,多个省份陆续更新了新能源并网运行管理细则,日内预测偏差考…...

零碳园区管理系统投资效益分析与评估模型的未来发展趋势

在“双碳”目标深度推进的背景下,零碳园区已从政策试点升级为产业绿色转型的核心载体,零碳园区管理系统作为园区碳排管控、能源优化的核心技术支撑,其投资价值与评估体系的完善程度,直接决定园区零碳转型的效率与质量。当前&#…...

养老设计行业黑马崛起:揭秘深圳医博传人如何用3个月霸榜搜索引擎的“危险操作“

当传统养老院还在用"夕阳红"做卖点时 这家公司已经让90后开始抢订床位 您是否好奇:为什么同样的养老设计方案,有的公司门可罗雀,而深圳医博传人设计院的咨询电话却被"打爆"?这背后藏着一个大多数同行都不敢尝…...

中国1:100万地貌类型空间分布数据|14类精细划分|全国覆盖|SHP矢量|含海拔+起伏度属性

🔍 数据简介 本数据集源自 《中华人民共和国地貌图集(1:100万)》(科学出版社,2009年),由中国科学院地理科学与资源研究所牵头全国科研与制图单位共同编制,是全球首套海陆一体化百万分…...

人脸识别OOD模型快速入门:10分钟部署指南

人脸识别OOD模型快速入门:10分钟部署指南 1. 引言 人脸识别技术在日常生活中的应用越来越广泛,从手机解锁到门禁系统,再到身份验证,几乎无处不在。但你是否遇到过这样的情况:系统在面对模糊照片、遮挡人脸或者极端光…...

长芯微LD9680完全P2P替代AD9680,是 14 位 1000MSPSA/D 转换器采用 QFN64 封装

产品描述LD9680 是14 位 1000MSPSA/D 转换器采用 QFN64 封装,功能框图如图 1 所示。该器 件内置片内缓冲器和采样保持电路,专门针对低功耗、小尺寸和易用性而设计。该器件设计 用于高达 2GHz 的宽带模拟信号采样。该器件针对宽输入带宽、高采样速率、出色…...

计算机毕业设计springboot高校智慧图书管理系统 基于SpringBoot的高校智能图书服务平台设计与实现 SpringBoot框架下高校数字化图书馆管理系统开发

计算机毕业设计springboot高校智慧图书管理系统6y8026n8 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着信息技术的快速发展和高校数字化转型的深入推进,传统图书…...

小游戏上线后,收益到底如何?

大家好,我是晋十七。我开发的竖版塔防小游戏《奥术守卫者》已经上线一段时间了,并且也开通了流量主。很多小伙伴都很好奇个人做小游戏到底能不能赚钱?今天我就跟大家聊聊这个事情。收益展示先上截图吧,我的这款游戏大概是2月中旬上…...

2026毕业论文提速,文鉴智检工具深度分析

毕业季倒计时!2026届毕业生最头疼的问题,莫过于毕业论文的“格式内耗”和“内容打磨”——明明内容达标,却被页眉页脚、参考文献格式反复打回;逐字逐句校对错别字、语法错误,耗时又易漏;好不容易改完格式&a…...

DS2协议库:面向汽车ECU诊断的K-Line通信实现

1. DS2协议库技术解析:面向汽车ECU诊断的K-Line通信实现1.1 协议背景与工程定位DS2(Diagnostic Services 2)并非ISO标准协议,而是宝马(BMW)MS系列发动机控制单元(ECU)在K-Line物理层…...

计算机毕业设计springboot项目管理系统 基于SpringBoot的企业级协同任务管控平台 SpringBoot驱动的智能工作流与资源调度系统

计算机毕业设计springboot项目管理系统wxsy6muz (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在数字化转型浪潮席卷全球的当下,企业对于高效协同与精细化管控的需求…...

2026年不踩雷!论文写作全流程降重首选 —— 千笔·专业降AIGC智能体

在AI技术迅猛发展的今天,越来越多的学生和研究者开始借助AI工具辅助论文写作,以提升效率与质量。然而,随着学术审查标准的不断升级,AI生成内容的痕迹愈发明显,查重系统对AIGC的识别也日益精准。许多学生因此陷入“AI率…...

24.两两交换链表中的节点(LeetCode)

题目分析: 为链表建立一个虚拟头节点,然后对接下来的两个节点进行位置交换。设置一个指针变量 cur让其指向虚拟头节点 循环遍历的终止条件为cur->next!NULL 并且cur->next->next!NULL 每次循环时,先定义一个指针变量 temp保存 cu…...

真心不骗你!全学科适配降AI率网站,千笔·降AI率助手 VS 万方智搜AI

在AI技术迅速发展的今天,越来越多的学生和研究者开始借助AI工具辅助论文写作,以提高效率、优化内容。然而,随着学术审核标准的不断提升,AI生成内容的痕迹越来越容易被检测出来,论文中的“AI率超标”问题也日益突出。面…...

对比一圈后!巅峰之作的降AI率软件 —— 千笔·专业降AIGC智能体

在AI技术快速发展的今天,越来越多的学生和研究者开始依赖AI工具辅助论文写作,以提升效率和质量。然而,随着学术审查标准的不断提高,AI生成内容的痕迹越来越容易被检测出来,导致论文AI率超标、重复率过高等问题频发。面…...

如何连接一个隐藏的wifi?

前言某些情况下,我们并不希望自己的wifi被其他人扫描到,选择将wifi网络隐藏起来,本文将从应用开发角度说明,APP应该如何连接这些被隐藏起来的wifi开发实例话不多说,直接上代码private void init() {mWifiManager (Wif…...

世嘉MD完全档案中文版PDF

核心内容分区MD 本体(1988–1996):硬件迭代(MD1/MD2/MD3)、手柄、卡带;全游戏封面 截图 基础信息Mega-CD(1991–1996)、Super 32X(1994–1995)扩展外设与专…...