CAS机制总结

  • cas机制
  • cas和synchronized 区别,场景,有缺点
  • cas底层实现、ABA问题场景、解决办法

场景:公共内存值v=10,线程a,b分别对10进行5次++操做,最后结果20。
问题若是不加锁,a获得内存值10在进行++操做时,b也得到内存值10进行++操做。
此时就会出现结果<20的状况。java

1、

cas机制:compare and swap(比较和替换)

cas三个操做数:V(内存值) A(旧的预期值) B(新值)

cas的使用场景:juc下lock、atomic操做
cas乐观锁(循环内自旋),原理:A=得到内存值,B=对A进行累加操做后的值。更新内存值V为B的时候先将V和A对比,
若是相等,那么V替换B退出循环,若是不相等,从新得到内存值,进行操做。
此套流程如何保证内存值是最新的?详见volatile原理
此套流程如何保证V,A比较B替换V时是原子操做?cas底层用unsafe直接访问底层操做系统,作了硬件级别的原子操做。多线程

2、

synchronized:悲观锁,当synchronized锁住后,其它线程处于blocking状态,当其他线程得到锁后,
会进入runnable状态,这个过程当中涉及到操做系统用户模式和内核模式的转换,代价比较高。
并发量很高的话,synchronized仍是比较适合的。并发

3、

cas优势:如一描述在并发量不是很高时cas机制会提升效率。
cas缺点:
一、cpu开销大,在高并发下,许多线程,更新一变量,屡次更新不成功,循环反复,给cpu带来大量压力。
二、只是一个变量的原子性操做,不能保证代码块的原子性。
三、ABA问题高并发

4、

aba问题:内存值V=100;
threadA 将100,改成50;
threadB 将100,改成50;
threadC 将50,改成100;atom

场景:小牛取款,因为机器不太好使,多点了几回全款操做。后台threadA和threadB工做,
此时threadA操做成功(100->50),threadB阻塞。正好牛妈打款50元给小牛(50->100),
threadC执行成功,以后threadB运行了,又改成(100->50)。
牛气冲天,lz钱哪去了???操作系统

如何解决aba问题:
对内存中的值加个版本号,在比较的时候除了比较值还的比较版本号。线程

java:AtomicStampedReference就是用版本号实现cas机制。内存

相关文章
相关标签/搜索