CAS知识点讲解

简介: CAS知识点讲解

什么是CAS?

CAS全称 Compare And Swap ,比较与交换,是乐观锁的主要实现方式。CAS在不使用锁的情况下实现 多线程之间的变量同步。 ReentrantLock 内部的AQS和原子类内部都使用了CAS。

CAS算法涉及到三个操作数:

  • 需要读写的内存值V。
  • 进行比较的值A。
  • 要写入的新值B。

只有当V的值等于A时,才会使用原子方式用新值B来更新V的值,否则会继续重试直到成功更新值。

以 AtomicInteger 为例, AtomicInteger 的 getAndIncrement() 方法底层就是CAS实现,关键代码是 compareAndSwapInt(obj, offset, expect, update) ,其含义就是,如果 obj 内的 value 和 expect 相等,就证明没有其他线程改变过这个变量,那么就更新它为 update ,如果不相等,那就会继 续重试直到成功更新值。

CAS存在的问题?

CAS 三大问题:

1. ABA问题。CAS需要在操作值的时候检查内存值是否发生变化,没有发生变化才会更新内存值。但 是如果内存值原来是A,后来变成了B,然后又变成了A,那么CAS进行检查时会发现值没有发生变 化,但是实际上是有变化的。ABA问题的解决思路就是在变量前面添加版本号,每次变量更新的时 候都把版本号加一,这样变化过程就从 A-B-A 变成了 1A-2B-3A 。 JDK从1.5开始提供了AtomicStampedReference类来解决ABA问题,原子更新带有版本号的引用类 型。

2. 循环时间长开销大。CAS操作如果长时间不成功,会导致其一直自旋,给CPU带来非常大的开销。

3. 只能保证一个共享变量的原子操作。对一个共享变量执行操作时,CAS能够保证原子操作,但是对 多个共享变量操作时,CAS是无法保证操作的原子性的。 Java从1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,可以把多个变量放在 一个对象里来进行CAS操作。

相关文章
|
3月前
|
存储 缓存 关系型数据库
【MySQL】MySQL存储引擎:InnoDB vs MyISAM 核心区别、适用场景
本文系统剖析InnoDB与MyISAM两大MySQL存储引擎,涵盖定位、特性对比、底层原理、适用场景、选型决策及最佳实践六大维度,深度解读事务支持、锁机制、MVCC、索引架构、崩溃恢复等核心差异,助力面试、开发与运维高效决策。
|
3月前
|
存储 监控 NoSQL
【Redis】Redis 高可用:主从复制、哨兵Sentinel、Redis Cluster分片原理、哈希槽、故障转移、数据倾斜优化
本文系统梳理Redis高可用演进路径(单机→主从→哨兵→Cluster),深入解析三大方案原理:主从复制的PSYNC增量同步机制、哨兵的双层下线判定与Raft选举、Cluster的哈希槽分片与Gossip通信。涵盖故障自愈、数据一致、水平扩展等核心目标,及脑裂防控、数据倾斜治理等生产级最佳实践。
|
数据安全/隐私保护
经典权限系统设计(五张表)
经典权限系统设计(五张表)
Mac删除APP后台活动全攻略(副标题:彻底清理Mac后台,提升运行速度)Mac删除APP后台活动全攻略
本文详细介绍如何清理Mac后台活动,提升系统运行速度与电池续航。通过活动监视器、系统设置登录项管理及终端命令三种方法,帮助用户彻底删除APP后台进程,实现Mac性能优化,适合新手和进阶用户参考操作。
|
11月前
|
Web App开发 前端开发 JavaScript
Playwright极速UI自动化实战指南
Playwright告别Selenium痛点,以智能等待、强大选择器、网络拦截与多设备模拟四大利器,提升自动化效率与稳定性。本文通过实战代码详解其加速秘籍,助你构建高效、可靠的UI测试方案。
|
网络协议 安全 Devops
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
673 4
|
缓存 网络协议 安全
阿里云DNS常见问题之新疆地区无法访问网址如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
存储 Oracle 关系型数据库
OceanBase有什么优势?
【8月更文挑战第12天】OceanBase有什么优势?
960 3
|
Java 微服务 Spring
【Spring Cloud】spring cloud 调用feign请求超时 feign.RetryableException: Read timed out executing POST
【Spring Cloud】spring cloud 调用feign请求超时 feign.RetryableException: Read timed out executing POST
3119 0
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-RedisObject
Redis入门到通关之数据结构解析-RedisObject
539 1

热门文章

最新文章