CAS简单解析

1.为什么要有CAS

1).CAS主要用于实现多线程 之间的变量同步问题

多线程在访问和修改同一个变量时,如何确保这些访问和修改是协调一致的问题。

多线程环境下,容易造成数据不一致、脏读、竞态条件等后果。常使用锁、使用原子操作(如CAS)、使用信号量等等来解决该问题。

2).非阻塞的方式避免了传统锁机制中的线程阻塞和唤醒操作,从而提高了系统的并发性能。

2.什么是CAS

Compare-And-Swap,即"比较并交换",是一种无锁算法 (一种原子操作)。

算法(原子操作)过程:

a)读变量为预期值

b)比较这个变量的内存值(可能在从a到b这个过程中被人改了,改了内存值就是改完的值,没改内存值就是原来的值,总之内存值是b这个状态下变量的值)和预期值

c)相同则更新变量,不同则自旋(自旋指的是重新从a过程开始循环尝试,直到成功更新变量值,或者达到自旋次数或时间)、或回退、或重试。
与加锁的区别: CAS非阻塞

3.怎么用CAS

java 复制代码
// 假设这是你的共享变量  
int count = 0;  
  
// 假设这是你想要加到count上的值  
int increment = 1;  
  
// 无限循环,直到CAS成功为止(在实际应用中,你可能会有更合适的退出条件)  
while (true) {  
    // 读取count的当前值作为预期值  
    int expectedValue = count;  
      
    // 尝试使用CAS将count的值从expectedValue更新为expectedValue + increment  
    // 如果在这之间没有其他线程修改count的值,那么CAS将成功  
    if (atomicCount.compareAndSet(expectedValue, expectedValue + increment)) {  
        // CAS成功,跳出循环  
        break;  
    }  
      
    // 如果CAS失败,说明count的值在你读取之后被其他线程修改了  
    // 循环将继续,并再次尝试更新  
    // 注意:这里不需要做任何特殊的处理来"重试",因为循环本身就在不断地重试  
}  
  
// 注意:上面的代码示例假设了存在一个名为atomicCount的AtomicInteger实例  
// 但在实际Java代码中,你会直接使用AtomicInteger的incrementAndGet()方法  
// 来完成上述的加操作,而无需手动编写CAS循环  
  
// 正确的Java代码示例  
AtomicInteger atomicCount = new AtomicInteger(0);  
atomicCount.incrementAndGet(); // 这将自动处理CAS循环,并返回更新后的值
相关推荐
萧瑟余晖29 分钟前
JDK 26 新特性详解
java·开发语言
马优晨1 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说4 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19944 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了5 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品5 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘5 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记6 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵6 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
极光代码工作室7 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发