CAS无锁算法

CAS即compare and swap.CAS的语义:我认为V的值应该为A,如果是,那么将V的值改为B,否则不修改并告诉V的值实际为多少(内存值V,旧的预期值A,要修改的值B)是一种解决锁机制带来的问题方案.
例如有个int i = 5,两个线程都将对i进行 i++操作;如图中红色和绿色两个线程:
在这里插入图片描述
当红色线程先抢到资源对i进行操作时,先匹配A的值为5,符合则进行i++操作。此时绿色线程开始抢到资源,发现A的值为5而i=6,与预期值不符合,则重新返回修正。
在这里插入图片描述
锁分为悲观锁和乐观锁,但都是一种悲观策略,会带来诸多问题:如多个线程要等待共同的被占用资源,优先级高的线程等待优先级的线程,性能问题.
CAS是一种乐观策略.有三个值:V(内存值[原值]),E(期待值[携带的原值]),N(新值[基于旧值经过运算后的新值]).只有当E=V时,才进行操作,否则不操作或重新运算.
CAS的运用:AtomicInteger,JDK1.8后concurrentHashMap取消分段锁,而采用CAS算法,当数目达到8个后用红黑树.
CAS也存在问题:
1.ABA问题,当内存值经过多次修改后,由原来的A变为B,最后再变为A.此过程原链表或数据结构可能发现改变,解决方案:增加个版本号;
2.循环时间长开销大:当V!=E时,CAS算法会不断重新执行;不过jvm支持处理器pause指令时,效率会提高明显.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值