CAS问题

本文探讨了CAS(CompareAndSwap)在并发编程中的作用,它如何确保原子性操作。同时,文章指出了ABA问题,即在CAS操作过程中可能出现的值变化情况。为解决ABA问题,提出了使用时间戳或者版本号的策略。此外,还介绍了Java的原子变量类,如AtomicInteger,它们在保证并发安全的同时提供了高效性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CAS(Compare And Swap)是由硬件实现的。

CAS可以将读 改 写 这类的操作转换为原子操作

这个问题是当绿色线程走到第二步,还没有到第三步。此时蓝线程开始了第一步,这样这个变量的期待值不是12 而是11.

ABA问题

CAS:在数据更新到主内存前(也就是图中第二步与第三步之间),将再次读取内存共享变量的值,如果现在读取的值与第一步的值一样就执行最后一步,把数据更新到线程的内存的主内存中,如果不一样则就撤销本次操作。

这里还有个问题:有个假设共享变量的当前值与当前线程提供的期望值相同,就认为这个变量没有被其他线程修改过。 但是这种不一定是对的 比如有个共享变量count =0;线程a将count修改为20,线程b将count修改为10,线程c将count修改为0.又有个当前线程看到变量count值为0,线程就认为这个变量没有被其他线程修改过。

若想要规避这个aba问题,可以为共享变量一如一个时间戳,每次修改共享变量相应的时间戳就会改变,这样就可以查看有没有被更改过。

原子变量类

原子变量类基于CAS实现的,当对共享变量进行read-modify-write更新操作时,通过原子变量可以保障操作的原子性与可见性。对变量read-modify-write更新操作是指当前操作不是一个简单的赋值,而是变量的新值依赖变量的旧值,如自增操作i++,由于volatile只能保证操作的可见性,无法保障原子性,原子变量类内部就是借助一个volatile变量,并且保证了该变量的read-modify-write操作的原子性,有时把原子变量类看作是增强的volatile变量,原子变量类有12个

分组原子变量类
基础数据型AtomicInteger,AtomicLong,AtomicBoolean 
数组型AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray
字段更新器

AtomicIntegerFileUpdater,AtomicLongfieldUpdater

AtomicReferenceFileUpdater

引用型

AtomicReference,AtomicStampedReference

AtomicMarkableReference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值