Java随笔-CASAQS
一、CASCompare And Swap1. 基本概念CAS 是一种乐观锁实现包含三个操作数内存值 V当前主内存中的值预期值 A线程本地记录的旧值新值 B要更新的值核心逻辑只有当 V A 时才将 V 更新为 B否则重试。2. 底层实现// Unsafe 类中的 CAS 操作底层调用 CPU 指令publicfinalnativebooleancompareAndSwapInt(Objecto,longoffset,intexpected,intx);硬件层面现代 CPU 提供 cmpxchg 指令x86或 LDREX/STREXARM保证操作的原子性。3. 典型应用类说明AtomicInteger/AtomicLong原子整型AtomicReference原子引用AtomicStampedReference解决 ABA 问题带版本号ConcurrentHashMap分段锁 CAS 优化ABA 问题问题描述值从 A → B → ACAS 检测不出变化。解决方案AtomicStampedReference 增加版本号/时间戳。AtomicStampedReferenceIntegerrefnewAtomicStampedReference(100,0);int[]stampHoldernewint[1];Integervalueref.get(stampHolder);// 获取值和版本号ref.compareAndSet(100,200,stampHolder[0],stampHolder[0]1);5. CAS 的优缺点优点缺点无锁性能高无线程切换开销只能保证单个变量的原子性非阻塞不会死锁循环重试消耗 CPU自旋存在 ABA 问题二、AQSAbstractQueuedSynchronizer1. 基本概念AQS 是 JUC并发包的基石是一个用于构建锁和同步器的抽象框架。核心设计state 变量int 类型表示同步状态如重入锁的重入次数、信号量的许可数FIFO 队列CLH 变体的双向链表管理等待线程模板方法模式子类只需实现特定方法2. 核心结构3. 两种模式模式说明代表类独占模式同一时间只有一个线程能获取ReentrantLock共享模式多个线程可同时获取Semaphore、CountDownLatch4. 核心方法子类需实现// 独占模式protectedbooleantryAcquire(intarg);// 获取锁protectedbooleantryRelease(intarg);// 释放锁// 共享模式protectedinttryAcquireShared(intarg);// 获取共享锁protectedbooleantryReleaseShared(intarg);// 释放共享锁// 通用protectedbooleanisHeldExclusively();// 是否被独占5. 队列节点Node状态状态值含义CANCELLED1节点被取消超时或中断SIGNAL-1后继节点需要被唤醒CONDITION-2在 Condition 队列中PROPAGATE-3共享模式传播6. 获取锁的流程以 ReentrantLock 为例7. 核心源码分析// AQS 获取锁的入口publicfinalvoidacquire(intarg){if(!tryAcquire(arg)// 1. 快速尝试获取acquireQueued(addWaiter(Node.EXCLUSIVE),arg))// 2. 入队 排队获取selfInterrupt();// 3. 恢复中断状态}// 入队操作CAS 保证线程安全privateNodeaddWaiter(Nodemode){NodenodenewNode(Thread.currentThread(),mode);Nodepredtail;if(pred!null){node.prevpred;if(compareAndSetTail(pred,node)){// CAS 入队pred.nextnode;returnnode;}}enq(node);// 初始化或重试returnnode;}8. AQS 应用同步器模式用途ReentrantLock独占可重入互斥锁ReentrantReadWriteLock独占共享读写分离锁Semaphore共享限流/资源池CountDownLatch共享等待多线程完成CyclicBarrier共享线程互相等待Phaser共享分阶段任务三、CAS vs AQS维度CASAQS层级底层原子操作上层同步框架机制乐观锁无锁悲观锁 队列适用场景简单变量更新复杂同步控制线程冲突重试自旋阻塞 park/unpark CPU 消耗高冲突时较高阻塞后较低关系AQS 内部用 CAS 维护 state 和队列四、实际应用1. 基于 CAS 的原子计数器AtomicIntegercounternewAtomicInteger(0);// 底层CAS 循环直到成功counter.incrementAndGet();基于 AQS 的自定义锁classSimpleLockextendsAbstractQueuedSynchronizer{OverrideprotectedbooleantryAcquire(intarg){returncompareAndSetState(0,1);// CAS 修改 state}OverrideprotectedbooleantryRelease(intarg){setState(0);returntrue;}publicvoidlock(){acquire(1);}publicvoidunlock(){release(1);}}五、总结CAS 是 Java 实现无锁并发的底层利器适用于低竞争、简单场景AQS 是构建复杂同步器的框架通过 state CLH 队列 CAS 实现了高效的线程阻塞与唤醒两者相辅相成AQS 内部大量依赖 CAS 操作如 compareAndSetState、compareAndSetTail

相关新闻

定时任务调度:schedule与APScheduler

定时任务调度:schedule与APScheduler

一、为什么需要定时任务? 在软件开发中,我们经常需要让程序在 指定的时间 或 按照固定的周期 自动执行某些操作,例如: 每天凌晨备份数据库; 每隔 5 分钟拉取第三方 API 数据; 每周一早上 9 点发送周报邮件; 每月 1 号清理过期日志文件; 在用户会话超时后自动清理资源。…

2026/7/3 1:40:17 阅读更多 →
极限竞速地平线4/5游戏修改神器:Forza Mods AIO的3大核心解决方案

极限竞速地平线4/5游戏修改神器:Forza Mods AIO的3大核心解决方案

极限竞速地平线4/5游戏修改神器:Forza Mods AIO的3大核心解决方案 【免费下载链接】Forza-Mods-AIO Free and open-source FH4 & FH5 mod tool 项目地址: https://gitcode.com/gh_mirrors/fo/Forza-Mods-AIO 还在为极限竞速地平线4和地平线5中的各种限制…

2026/7/3 1:40:17 阅读更多 →
STM32与SPI EEPROM高速数据存储检索实战

STM32与SPI EEPROM高速数据存储检索实战

1. 项目背景与核心需求在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。25CSM04这款4Mbit SPI接口EEPROM与STM32F401RE微控制器的组合,为解决这一问题提供了理想的硬件平台。25CSM04是Microchip公司生产的一款高性能串行EEPROM&…

2026/7/3 1:38:17 阅读更多 →

最新新闻

终极B站视频下载指南:解锁大会员4K和充电专属内容

终极B站视频下载指南:解锁大会员4K和充电专属内容

终极B站视频下载指南:解锁大会员4K和充电专属内容 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否曾经想要永久保存…

2026/7/3 2:44:33 阅读更多 →
Loki MCP Server -支持Claude Desktop/Claude Code/Cursor 等客户端通过自然语言查询日志

Loki MCP Server -支持Claude Desktop/Claude Code/Cursor 等客户端通过自然语言查询日志

MCP定位,技术栈,架构,项目结构,基础框架搭建,开发部署及常见问题 # Loki MCP Server - CLAUDE.md> Go 实现的 MCP Server,集成 Grafana Loki 日志查询。支持 Claude Desktop / Claude Code / Cursor 等…

2026/7/3 2:42:31 阅读更多 →
嵌套 H5 的跨端通信:iOS / Android / 小程序 / 浏览器

嵌套 H5 的跨端通信:iOS / Android / 小程序 / 浏览器

一、为什么要做“统一桥接层”? “Write once, run anywhere” 对于纯展示型 H5 是成立的。但只要涉及到业务交互,比如:调起原生登录、保存图片到相册、修改系统状态栏颜色、分享到朋友圈,浏览器标准的 Web API 根本无能为力。 …

2026/7/3 2:40:31 阅读更多 →
交叉熵损失函数实战指南:原理、陷阱与工业级调优

交叉熵损失函数实战指南:原理、陷阱与工业级调优

1. 项目概述:为什么交叉熵损失函数不是“又一个公式”,而是模型精度的隐形操盘手在机器学习项目里,你调用model.compile(losscategorical_crossentropy)可能只需要0.3秒,但背后这个看似简单的函数,却直接决定了模型是“…

2026/7/3 2:38:31 阅读更多 →
ThreadLocalMap 设计及工作原理

ThreadLocalMap 设计及工作原理

把焦点深入到 ThreadLocalMap 这个核心容器上。它是理解整个 ThreadLocal 机制的关键,也是一个精巧的、为特定场景优化的定制化哈希表。下面我从数据结构、哈希冲突解决、扩容机制和关键操作四个维度,剖析它的设计精髓。1. 数据结构:弱引用的…

2026/7/3 2:36:30 阅读更多 →
Node.js Promise.all 并行查询实战:性能提升与错误处理详解

Node.js Promise.all 并行查询实战:性能提升与错误处理详解

在 Node.js 后端开发中,我们经常需要从多个数据源(如数据库、外部 API、文件系统)并行获取数据。如果采用传统的串行 await 方式,总耗时将是所有异步操作耗时的总和,这在处理高并发或延迟敏感的业务时是无法接受的。…

2026/7/3 2:36:30 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻