什么是CAS 以及 CAS 中的 ABA 问题

本文深入探讨了Java并发中的CAS(CompareAndSwap)算法,它基于乐观锁思想实现线程间的原子性操作。CAS通过比较并交换值来确保数据的正确性,避免了线程阻塞带来的开销。然而,CAS存在ABA问题,即在某个值从A变为B再变回A的过程中,可能会导致数据一致性问题。为解决此问题,通常引入版本号机制。此外,文章还讨论了CAS的自旋等待策略,以及在高并发场景下可能导致的CPU资源浪费。
摘要由CSDN通过智能技术生成


在多线程并发当中,要保证线程的原子性。

原子类的原子性是通过 volatile + CAS 来实现原子操作的。

概念

CAS(Compare And Swap)是指比较并交换。CAS算法 CAS(V,E,N)包含有3参数,V 表示要更新的变量,E 表示预期的值,N 表示新值。

在且仅在 V 值等于 E 值时,才会将 V 值设为 N, 如果V 值和E 值不同,则说明已经有其他线程做了更新,当前线程什么都不做。最后,CAS返回当前 V 的真实值。

这种做法的效率是高于加锁的,当 V 和E 判断不一样的时候,也就不更新值,也不会发送阻塞,继续获得CPU的执行权,继续判断并执行。

在这里插入图片描述

CAS的特性:乐观锁

CAS 的操作采用的了乐观锁的思想,总是认为自己是可以成功完成操作的。在有多个线程可以同时使用 CAS 操作一个变量时,只有一个会胜出并成功更新,其余均会失败。
失败的线程是不会挂起的,仅仅是被允许再次尝试,当然,也允许失败的线程放弃操作的。 基于这样的原理,CAS 操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。

CAS的自旋等待

在 JDK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值