wordpress站群 会员,成都最专业做网站的,wordpress删除多余图片的插件,东营城乡规划网文章目录1:何为CAS2:CAS图示3:CAS和Volatile的关系4:为何CAS效率更高一些5:CAS的特点7:受保护得共享数据类型(1):原子基本数据类型(2):原子引用数据类型7:ABA问题(1):什么是ABA(2):如何解决呢#xff1f;1:何为CAS
CAS(Compare And Swap)#xff0c;即比较并交换。是解决多线… 文章目录1:何为CAS2:CAS图示3:CAS和Volatile的关系4:为何CAS效率更高一些5:CAS的特点7:受保护得共享数据类型(1):原子基本数据类型(2):原子引用数据类型7:ABA问题(1):什么是ABA(2):如何解决呢1:何为CAS
CAS(Compare And Swap)即比较并交换。是解决多线程并行情况下使用锁造成性能损耗的一种机制。CAS操作包含三个操作数——内存位置V、预期原值A和新值(B)。如果内存位置的值与预期原值相匹配那么处理器会自动将该位置值更新为新值。否则处理器不做任何操作。CAS有效地说明了“我认为位置V应该包含值A如果包含该值则将B放到这个位置否则不要更改该位置只告诉我这个位置现在的值即可。
2:CAS图示
我们对共享资源balance用 AtomicInteger修饰,调用其compareAndSet方法使每次更余额的时候我们的余额都是最新值。 流程展示
解释图示中的注释中线程2对共享变量的操作发生在 线程1 中 int next prev - amount 和 if …之间在这其中发生了上下文切换。
3:CAS和Volatile的关系
获取共享变量时需要用到volatile修饰变量来保证变量的可见性CAS必须借助volatile才能读取到共享变量的最新值来实现比较交换。
4:为何CAS效率更高一些
无锁情况下即使重试失败线程始终在高速运行没有停歇而synchronized会让线程在没有获得锁的 时候发生上下文切换进入阻塞。打个比喻线程就好像高速跑道上的赛车高速运行时速度超快一旦发生上下文切换就好比赛车要减速、熄 火等被唤醒又得重新打火、启动、加速.恢复到高速运行代价比较大但无锁情况下因为线程要保持运行需要额外CPU的支持CPU在这里就好比高速跑道没有额外的 跑道线程想高速运行也无从谈起虽然不会进入阻塞但由于没有分到时间片仍然会进入可阻塞状 态还是会导致上下文切换。
5:CAS的特点
结合CAS和volatile可以实现无锁并发适用于线程数少、多核CPU的场景下。
CAS是基于乐观锁的思想最乐观的估计不怕别的线程来修改共享变量就算改了也没关系我吃亏 点再重试呗。synchronized是基于悲观锁的思想最悲观的估计得防着其它线程来修改共享变量我上了锁你们都别 想改我改完了解开锁你们才有机会。CAS体现的是 无锁并发、无阻塞并发 请仔细体会这两句话的意思 因为没有使用synchronized,所以线程不会陷入阻塞这是效率提升的因素之一但如果竞净激烈可以想到重试必然频繁发生反而效率会受影响这里的重试就是pre值和内存值不一样CAS返回的结果false那么的话我们再进行一次CAS操作
7:受保护得共享数据类型
(1):原子基本数据类型 (2):原子引用数据类型 7:ABA问题
(1):什么是ABA
本来主线程从主存中获取到的值是A,然后我们进行CAS中的比较也是和主存中的A进行比较,但是如果有线程在主线程CAS操作之前将A改为B,又将B改为A的话那么主线程是感知不到的。
(2):如何解决呢
如果主线程希望只要有其他线程动过了,共享变量的话那么自己的CAS操作就算失败这时仅仅是比较值是不够的还要增加一个版本号只要有人动过共享变量的话那么版本号就会发生相应的变化一旦主线程发现版本号不同的话,那么我们就CAS操作失败