Java 并发编程(六)|并发进阶高频:CAS、锁升级

发布时间:2026/8/27 4:33:25

Java 并发编程(六)|并发进阶高频:CAS、锁升级
并发进阶前言常见的锁策略乐观锁 VS 悲观锁重量级锁 VS 轻量级锁自旋锁 VS 挂起等待锁读写锁可重入锁 VS 不可重入锁公平锁 VS 非公平锁synchronized 锁的策略CAS认识CAS应用CAS实现原子类实现自旋锁CAS的ABA问题synchronized 原理锁升级锁消除锁粗化全文总结 系列文章导航前言本篇承接上一篇《四大并发实战单例、阻塞队列、定时器与线程池》深挖 Java 并发底层锁机制与无锁 CAS 编程覆盖面试必考的各类锁区分、CAS 原子操作、synchronized 三大优化锁升级 / 消除 / 粗化全部配套伪代码 可运行实战案例吃透底层原理类面试核心考点。常见的锁策略乐观锁 VS 悲观锁这是“锁的一种特性”。此处的悲观和乐观是对后续锁冲突是否激烈给出的预测。乐观锁预测接下来锁冲突的概率不大就可以少做一些工作。悲观锁预测接下来锁冲突的概率很大就应该多做一些工作。重量级锁 VS 轻量级锁重量级锁锁的开销比较大。轻量级锁锁的开销比较小。乐观锁通常是轻量级的锁悲观锁通常是重量级的锁。自旋锁 VS 挂起等待锁自旋锁一种轻量级锁的典型实现。1往往在纯用户态实现。2比如一个while循环不停检查当前锁是否被释放若没有就继续循环释放了就获取到锁从而结束循环。忙等消耗CPU换来更快的响应速度。挂起等待锁一种重量级锁的典型实现。1要借助系统API实现。2一旦出现锁竞争就会在内核中触发一系列的动作比如让这个线程进入阻塞状态暂时不参与CPU调度。阻塞的开销很大。读写锁读写锁把加锁分成两种读加锁、写加锁读加锁读的时候可以读但是不可以写。写加锁写的时候不可以读也不可以写。两个线程加锁过程中1读锁和读锁之间不会产生竞争2读锁和写锁之间有竞争3写锁和写锁之间有竞争。可重入锁 VS 不可重入锁可重入锁一个线程针对同一把锁连续加锁两次不会死锁。不可重入锁一个线程针对同一把锁连续加锁两次会死锁。公平锁 VS 非公平锁当很多线程尝试加同一把锁时一个线程能够拿到锁其他线程阻塞等待一旦第一个线程释放锁之后接下来哪个线程能够拿到锁公平锁按照先来后到的顺序。非公平锁剩下的线程以均等的概率来重新竞争锁。操作系统提供的加锁API默认是非公平锁。synchronized 锁的策略乐观锁 VS 悲观锁自适应轻量级锁 VS 重量级锁自适应自旋锁 VS 挂起等待锁自适应。自适应1初始情况下synchronized会预测当前的锁冲突的概率不大此时以乐观锁模式运行轻量级锁基于自旋锁的方式实现2在实际使用过程中如果发现锁冲突的情况比较多synchronized就会升级成悲观锁重量级锁基于挂起等待的方式实现不是读写锁是可重入锁是非公平锁CAS认识CASCASCompare and swap比较交换的是内存和寄存器。比如有一个内存M两个寄存器ABCAS(M,A,B)如果M和A的值相同就把M和B里的值进行交换同时整个操作返回true否则无事发生同时整个操作返回false交换的本质是为了把B赋值给M。CAS其实是一个CPU指令。单个CPU指令是原子的就可以使用CAS完成一些操作进一步替代加锁。基于CAS实现线程安全的方式为“无锁编程”。应用CAS实现原子类publicclassDemo{publicstaticAtomicIntegercountnewAtomicInteger(0);publicstaticvoidmain(String[]args)throwsInterruptedException{// TODO 自动生成的方法存根Threadt1newThread(()-{for(inti0;i50000;i){count.getAndIncrement();//count}});Threadt2newThread(()-{for(inti0;i50000;i){count.getAndIncrement();}});t1.start();t2.start();t1.join();t2.join();System.out.println(count.get());}}原子类里面是基于CAS实现的。伪代码实现classAtomicInteger{privateintvalue;publicintgetAndIncrement(){intoldValuevalue;while(CAS(value,oldValue,oldValue1)!true){//这里的判定就是在判断是否有别的线程穿插过来oldValuevalue;}returnoldValue;}}加锁是通过阻塞的方式避免穿插执行CAS是通过重试的方式避免执行实现自旋锁伪代码publicclassSpinLock{privateThreadownernull;publicvoidlock(){// 通过 CAS 看当前锁是否被某个线程持有.// 如果这个锁已经被别的线程持有, 那么就⾃旋等待.// 如果这个锁没有被别的线程持有, 那么就把 owner 设为当前尝试加锁的线程.while(!CAS(this.owner,null,Thread.currentThread())){}}publicvoidunlock(){this.ownernull;}}CAS的ABA问题CAS进行操作的关键通过值“没有发生变化”来作为“没有其他线程穿插执行”的判定依据但这种判定方式不严谨极端情况下可能会有另一个线程穿插进来发生将值从A-B-A针对第一个线程虽然值没变但是实际上已经被穿插执行。解决方法让判定的数值按照一个方向增长不要反复横跳有增有减就会发生ABA。引入一个额外的变量版本号约定每次修改版本号就自增一次此时在使用CAS判定时就不是判定值了而是判定版本号看版本号是否变化了若版本号没变就代表没有线程穿插执行。synchronized 原理锁升级synchronized的状态变化无锁 - 偏向锁 - 自旋锁(轻量级锁) - 重量级锁。锁升级的过程是单向的不能再降级了。偏向锁不是真正加锁只是做了一个标记完全是运行时的优化策略。当锁冲突出现时偏向锁就升级成轻量锁就真正加锁了。锁升级的过程就是在性能和线程安全之间尽量进行权衡。锁消除编译器会自动针对当前写的加锁的代码做出判定如果编译器觉得这个场景不需要加锁此时就会把写的synchronized优化掉。例如StringBuilder 不带synchronizedStringBuffer 带有synchronized写了synchronized也不一定线程安全若在单个线程中使用StringBuffer编译器就会把synchronized优化掉编译器只会在自己非常有把握时才进行锁消除锁消除编译期锁消除运行时锁消除。保守保留锁编译器针对synchronized锁的处理策略。核心编译期无法预判运行时的线程竞争情况为了保证程序正确性不会擅自删除或修改代码逻辑只会把锁的语义完整保留到字节码中锁粗化锁的粒度synchronized中代码越少就认为锁的粒度越粗代码越少锁的粒度越细。for(...){sync(lock){n;}//锁粒度细}sync(lock){for(...){n;}//锁粒度粗}锁的粒度细的时候能够并发执行的逻辑更多更有利于充分利用CPU资源。若粒度细的锁被反复进行加锁解锁可能实际效果还不如粒度粗的锁涉及到频繁的锁竞争。全文总结本文完整梳理并发底层核心面试考点六类锁策略区分掌握不同锁适用业务场景CAS 无锁编程底层 CPU 指令原理、原子类实战、手写自旋锁以及 ABA 问题解决方案synchronized 底层三大核心优化单向锁升级、编译期锁消除、锁粗化理解 JVM 锁性能优化逻辑。后续会更新 JUC 工具类、线程安全集合全套实战内容欢迎点赞收藏评论区交流面试学习心得 系列文章导航本篇是「Java并发编程系列」的连载内容点击链接查看完整系列 上一篇Java 并发编程五四大并发实战单例、阻塞队列、定时器与线程池 点击直达「Java并发编程」专栏合集

相关新闻

LLaMA-Factory 部署与 DeepSeek-R1-Distill-Qwen 模型乱码问题解决全记录

LLaMA-Factory 部署与 DeepSeek-R1-Distill-Qwen 模型乱码问题解决全记录

2026/8/27 11:36:45

LLaMA-Factory 部署与 DeepSeek-R1-Distill-Qwen 模型乱码问题解决全记录 摘要:本文记录了在远程 A100 服务器上部署 LLaMA-Factory,并加载 DeepSeek-R1-Distill-Qwen 系列模型时遇到的输出乱码问题。通过强制指定 Qwen2Tokenizer,最终完美解…

AI微调是什么?不懂这个别说你懂AI

AI微调是什么?不懂这个别说你懂AI

2026/8/24 13:51:36

微调到底是什么 微调的英文是 Fine-tuning,字面意思就是「fine tune(精细调节)」。 大模型训练分两个阶段。 第一个阶段叫预训练。给AI喂几百GB的文本,让它学会语言规律、世界知识。这个阶段极贵,几千万到几个亿美金&a…

Eclipse Ditto 物模型搭建

Eclipse Ditto 物模型搭建

2026/8/22 19:55:11

需要知道Eclipse Ditto是什么 、怎么安装就点击下面的链接查阅。 Eclipse Ditto 、 Mosquitto MQTT 、 OpenModelica 开发工具-CSDN博客 Eclipse Ditto 开发环境 搭建-CSDN博客 Eclipse Ditto:开源物联网数字孪生平台技术深度解析 - 东峰叵,com - 博客园 一、主要…

从物理动力学到策略优化:自行车运动员能量建模与MATLAB实现

从物理动力学到策略优化:自行车运动员能量建模与MATLAB实现

2026/8/27 11:27:56

1. 从一道赛题到一套方法论:自行车运动员能量特征建模的深度复盘去年带学生备赛美赛,A题“自行车运动员的能量特征”让不少队伍直呼“物理劝退”。题目本身并不复杂,核心是建立一个数学模型,描述运动员在给定功率输出下&#xff0…

三分钟让 Axure RP 全变中文:axure-cn 中文语言包安装、验收与避坑完整指南

三分钟让 Axure RP 全变中文:axure-cn 中文语言包安装、验收与避坑完整指南

2026/8/27 11:27:56

三分钟让 Axure RP 全变中文:axure-cn 中文语言包安装、验收与避坑完整指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-c…

ncmdump 使用教程:拖一个 NCM 文件就能转出 MP3,单首或整张专辑都行

ncmdump 使用教程:拖一个 NCM 文件就能转出 MP3,单首或整张专辑都行

2026/8/27 11:27:56

ncmdump 使用教程:拖一个 NCM 文件就能转出 MP3,单首或整张专辑都行 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你从网易云音乐下载的歌曲,不少是 NCM 格式的——这是网易的加密音频格式&…

Go语言方法值 vs 方法表达式:区别、应用与最佳实践

Go语言方法值 vs 方法表达式:区别、应用与最佳实践

2026/8/27 11:27:56

相信绝大多数 Go 开发者都写过这样的代码:把一个方法赋值给一个变量,然后像普通函数一样调用它。比如 f : obj.Method ,这个 f 在 Go 里叫 方法值(method value) 。但很多人第一次看到 T.Method(obj) 这种写法…

模型评测标准化:告别“跑几个样例”的不确定性

模型评测标准化:告别“跑几个样例”的不确定性

2026/8/27 11:27:56

你在两个模型之间做选型,用同一个测试集各跑了一遍。第一天模型 A 领先,第二天换了个提示词模板,模型 B 反超。你准备把结果写进汇报,但心里清楚,这个结论大概率经不起复测。这个场景很多做过模型评测的人都经历过。问…

信息几何视角下的GFlowNets前向策略训练:自然梯度提升收敛稳定性

信息几何视角下的GFlowNets前向策略训练:自然梯度提升收敛稳定性

2026/8/27 11:17:56

这次我们看一个 GFlowNets 训练方向的新思路:Information-Geometric Forward Policy Training。它要解决的是生成流网络(Generative Flow Networks)中前向策略(forward policy)训练不稳定、分布偏移明显、在复杂离散图…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…