news 2026/1/1 16:02:52

什么是Java中的CAS(Compare-And-Swap)操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
什么是Java中的CAS(Compare-And-Swap)操作

一、Compare-And-Swap

  • 是CPU提供的一种原子指令
  • 无锁并发算法的基础,适合读多写少、竞争不激烈的场景

二、核心思想

  • 比较内存中的某个值是否为预期值,如果是,则更新为新值,否则不做修改。
  • 这个操作是原子性的。

三、工作原理

  1. Compare比较:CAS会检查内存中的某个值是否与期望值相等。
  2. Swap交换:如果相等,则将内存中的值更新为新值。
  3. 失败重试:如果不相等,说明其他线程已经修改了该值,CAS操作失败,一般会利用重试,直到成功。

四、CAS的优点

  • 无锁并发:CAS操作不使用锁,因此不会导致线程阻塞,提高了系统的并发性和性能。
  • 原子性:CAS操作是原子的,保证了线程安全。

五、CAS的缺点

  • ABA问题:CAS操作中,如果一个变量值从A变成B,又变回A,CAS无法检测到这种变化,可能导致错误。(解决方案:引入版本号或时间戳)
  • 自旋开销:CAS通过自旋实现,可能导致CPU资源浪费,尤其在高并发情况下。
  • 单变量限制:CAS操作仅适用于单个变量的更新,不适用于涉及多个变量的复杂操作。

六、在Java中的具体实现:Atomic原子类

import java.util.concurrent.atomic.AtomicInteger; public class AtomicDemo1 { // 基本类型原子类 private AtomicInteger atomicInt = new AtomicInteger(0); public void method1(){ // 标准的CAS使用方式 int oldValue, newValue; do { oldValue = atomicInt.get(); newValue = oldValue + 1; System.out.println(Thread.currentThread().getName() + "--oldValue:" + oldValue +";newValue:" + newValue); } while (!atomicInt.compareAndSet(oldValue, newValue)); // 内置方法 // atomicInt.decrementAndGet(); } public static void main(String[] args) throws InterruptedException { AtomicDemo1 atomicDemo1 = new AtomicDemo1(); Thread thread1 = new Thread(() -> { atomicDemo1.method1(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } }, "线程1"); Thread thread2 = new Thread(() -> { atomicDemo1.method1(); },"线程2"); thread1.start(); thread2.start(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/15 19:38:04

2025 RAG架构全景图:从核心原理到前沿实战全解读

RAG是增强大型语言模型的主流架构,通过检索外部数据解决模型知识局限性。本文将系统解析其核心原理、数据预处理与检索优化机制,并对比八种架构的适用场景,最后对端到端训练、多模态检索等的未来发展趋势作出展望。 简介 当今,检…

作者头像 李华
网站建设 2025/12/15 19:37:58

相亲局上,我把姑娘的“响应式”理解成了CSS

昨晚我又双叒加班了,修一个IE兼容性问题——虽然我不知道这世界上到底还有谁在用IE。正当我咬牙切齿地跟!important斗智斗勇时,我妈的微信像弹窗广告一样蹦出来:“明晚七点,咖啡馆,姑娘是UI设计师,你肯定聊…

作者头像 李华
网站建设 2025/12/30 12:40:21

HGDBL date_trunc() 和timestamp

文章目录环境文档用途详细信息环境 系统平台:Microsoft Windows (64-bit) 10 版本:5.6.4 文档用途 date_trunc() 和timestamp 时间用法 详细信息 timestamp 1、SELECT now()::timestamp ‘1 year’; 2、SELECT now()::timestamp ‘1 month’; 3、…

作者头像 李华
网站建设 2025/12/15 19:35:20

【资深架构师亲授】:Symfony 8中实现松耦合架构的7种方式

第一章:Symfony 8服务依赖注入核心概念在现代PHP开发中,Symfony 8通过依赖注入(Dependency Injection, DI)机制实现了松耦合与高可测试性的代码结构。依赖注入的核心思想是将对象的依赖关系由外部容器注入,而非在类内部…

作者头像 李华
网站建设 2025/12/15 19:33:55

Java毕设项目:基于springboot海洋馆预约购票系统的设计与实现基于springboot海洋馆预约系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2025/12/15 19:33:47

R语言在气象分析中的实战应用(极端值检测技术全公开)

第一章:R语言与气象数据分析概述R语言是一种专为统计计算和数据可视化设计的开源编程语言,凭借其强大的包生态系统和灵活的数据处理能力,在气象科学领域得到了广泛应用。气象数据通常具有高维度、时空连续性和复杂结构的特点,R提供…

作者头像 李华