CAS操作是怎么实现的

    CAS是compare and swap,翻译过来就是比较并交换。维护三个变量值,一个是内存值V,一个是期望的旧的值A,一个是要更新的值B。更新一个变量的时候,只有当预期值A与内存V中的值相等的时候,才会执行更新操作,把内存V的值改为B。

    从思想上来说,synchronized属于悲观锁,悲观的认为程序中的并发情况严重,所以严防死守,CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去重试更新。在java中,除了Atomic系列类,以及Lock系列类的底层实现,甚至在java1.6以上版本,synchronized在变为重量级锁之前,也会采用CAS机制。

缺点:

  1. CPU开销过大,因为如果有很多线程一直在反复尝试更新一个变量,却又更新不成功时,就会一直自旋消耗CPU;
  2. 不能保证代码块的原子性,它只能保证一个变量的原子性;
  3. ABA问题。(一个值从A变成B,又更新回A,普通CAS会误判通过检测。利用版本号机制可以解决ABA问题。)

 

unsafe类:

    java不能直接访问操作系统底层,而是通过本地方法来访问。unsafe类提供了硬件级别的原子操作,用来获取内存地址的值并进行修改,他的修改逻辑是对比内存地址的值和预期值是否一样,如果一样进行修改。利用的CAS原理。

 

参考:https://blog.youkuaiyun.com/qq_32998153/article/details/79529704

 

### CAS操作的定义与工作原理 #### 定义 CAS(Compare-And-Swap)是一种无锁算法,用于实现多线程环境下的原子操作。它通过硬件层面保障操作的原子性,避免了传统锁机制中线程阻塞的问题[^1]。CAS操作包含三个参数:内存位置(V)、预期值(A)以及新值(B)。如果内存位置的值等于预期值,则将其更新为新值;否则不进行任何操作。 #### 工作原理 CAS的工作原理可以分为两个阶段: 1. **比较阶段**:将内存位置的实际值与预期值进行比较。如果两者相等,则进入下一阶段;否则直接返回失败。 2. **交换阶段**:将内存位置的值替换为新值,并返回成功[^2]。 这种机制确保了在多线程环境下对共享变量的操作是原子性的,而无需使用锁来阻塞其他线程。 #### 并发编程中的作用 在并发编程中,CAS操作被广泛应用于以下场景: 1. **原子类实现**:Java中的`java.util.concurrent.atomic`包提供了多种基于CAS实现的原子类,例如`AtomicInteger`和`AtomicLong`。这些类通过CAS自旋的方式保证了多线程环境下的安全性[^3]。 2. **轻量级锁**:JVM中的轻量级锁状态利用CAS实现线程间的竞争。当一个线程尝试获取已被占用的锁时,会通过自旋的方式不断尝试CAS操作,直到成功获取锁或升级为重量级锁[^4]。 3. **无锁数据结构**:CAS操作被用来构建高效的无锁数据结构,例如`ConcurrentHashMap`和`ConcurrentLinkedQueue`。这些数据结构通过CAS实现了高并发场景下的性能优化[^5]。 #### 示例代码 以下是一个基于CAS实现的简单计数器示例: ```java import java.util.concurrent.atomic.AtomicInteger; public class CasCounter { private AtomicInteger count = new AtomicInteger(0); public void increment() { while (true) { int current = count.get(); // 获取当前值 int next = current + 1; // 计算下一个值 if (count.compareAndSet(current, next)) { // CAS操作 break; } } } public int getCount() { return count.get(); } } ``` 在这个例子中,`compareAndSet`方法实现CAS操作,确保了在多线程环境下的原子性。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值