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指令时,效率会提高明显.
CAS无锁算法
最新推荐文章于 2021-04-10 13:55:34 发布