每天一道面试题一CAS概念以及实现原理?

概念

全称:Compare and Swap 比较交换

原理

存在三个变量,一个变量是内存的值,另一个变量是预期值,还有一个变量是修改后的值
当一个线程需要修改数据时,首先会从内存中读取数据的值赋值给预期值,然后修改时会比较预期值和内存的值是否相等,如果相等,则修改,否则不修改重复上述操作

存在问题

ABA问题,一个线程把数据从A改变到B,然后又从B改变到A,值虽然不变,但是存在两次动作
并发越高,失败的次数会越多,CAS如果长时间不成功,会极大的增加CPU的开销。因此CAS不适合竞争十分频繁的场景。
只能保证一个共享变量的原子操作。当对多个共享变量操作时,CAS就无法保证操作的原子性。

解决方案

添加一个参数记录版本,每修改一次,版本号加1
Java1.5开始JDK提供了AtomicReference类来保证引用对象的原子性,可以把多个变量放在一个对象里来进行CAS操作。

引申Java知识点

Java1.5的Atomic包名为java.util.concurrent.atomic。这个包提供了一系列原子类,包含:
AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference
AtomicIntegerArray,AtomicLongArray
AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater
AtomicMarkableReference,AtomicStampedReference,AtomicReferenceArray

总结

cas是一种乐观锁,其在硬件层面保证了比较并交换操作的原子性,处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打码的加菲猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值