JUC--CAS 曾经终败给现在 2023-01-20 13:57 16阅读 0赞 原文网址:[JUC--CAS\_IT利刃出鞘的博客-CSDN博客][JUC--CAS_IT_-CSDN] # 其他网址 # > [【死磕Java并发】----深入分析CAS\_Java\_chenssy的博客-CSDN博客][Java_----_CAS_Java_chenssy_-CSDN] > [并发编程 CAS算法\_Java\_u014207606的博客-CSDN博客][CAS_Java_u014207606_-CSDN] # **简介** # > CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作,可以说CAS是整个JUC的基石。 **CAS说明** > * CAS是一种基于锁的操作,而且是乐观锁。 > * CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。若内存地址里面的值和A的值是一样的,就将内存里面的值更新成B。 > * CAS是通过**无限循环**来获取数据的,一旦检测到冲突产生,就重试当前操作直到没有冲突。若在第一轮循环中,a线程获取地址里面的值被b线程修改了,那么a线程自旋,直到某一次循环时地址里的值没有被修改。 > 以下组件都用到了CAS: > > * AQS同步组件 > * Atomic原子类操作 > * jdk8的ConcurrentHashMap使用CAS+Synchronized。 > ![SouthEast][] # **CAS缺点** # 主要表现在三个方面:CPU开销大;只能保证一个共享变量原子操作;ABA问题。 <table> <tbody> <tr> <td style="width:199px;"><strong>缺点</strong></td> <td style="width:329px;"><strong>说明</strong></td> <td><strong>解决方法</strong></td> </tr> <tr> <td style="width:199px;"><strong>CPU开销大</strong></td> <td style="width:329px;"> 如果自旋CAS长时间地不成功,则会给CPU带来非常大的开销。</td> <td> 在JUC中有些地方就限制了CAS自旋的次数,例如BlockingQueue的SynchronousQueue。</td> </tr> <tr> <td style="width:199px;"><strong>只能保证一个共享变量原子操作</strong></td> <td style="width:329px;"> CAS机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。</td> <td> <p> 比如需要保证3个变量共同进行原子性的更新,就不得不使用Synchronized了。</p> <p> 还可以考虑使用AtomicReference来包装多个变量,通过这种方式来处理多个共享变量的情况。</p> </td> </tr> <tr> <td style="width:199px;"><strong>ABA问题</strong></td> <td style="width:329px;"> 如果一个值原来是A,变成了B,然后又变成了A,那么在CAS检查的时候会发现没有改变,但是实质上它已经发生了改变,这就是所谓的ABA问题。在大部分情况下ABA问题并不会影响程序并发的正确性。</td> <td> <p> 即在每个变量都加上一个版本号,每次改变时加1,即A —> B —> A,变成1A —> 2B —> 3A。</p> <p> Java提供了AtomicStampedReference来解决。AtomicStampedReference通过包装[E,Integer]的元组来对对象标记版本戳stamp,从而避免ABA问题。</p> </td> </tr> </tbody> </table> [JUC--CAS_IT_-CSDN]: https://knife.blog.csdn.net/article/details/116746806 [Java_----_CAS_Java_chenssy_-CSDN]: https://blog.csdn.net/chenssy/article/details/69640293 [CAS_Java_u014207606_-CSDN]: https://blog.csdn.net/u014207606/article/details/85058077 [SouthEast]: /images/20221021/9b07c14179a247e88d06f0d4a5734ebb.png
还没有评论,来说两句吧...