深入理解Java多线程与并发框(第⑧篇)——深入理解:CAS

CAS 是 CompareAndSwap 的缩写,意思是 比较 并 交换。 它是无化的实现是经典的乐观锁。

CAS 操作很简单,它包含三个操作数:内存地址V、预期原值A、新值B。先比较内存地址V处的值与预期原值A是否相等,如果相等就将内存地址V处更新为新值B。在配合循环使用时,若CAS操作失败,会循环执行或到达某个终止处。此操作配合 循环 使用时,又称为 自旋锁 的实现方式。

CAS存在的问题

1. ABA的问题

比如一个线程操作时,先将内存地址V处的值A更新为值B,然后又将值B更新为值A。最后CAS判断内存地址V处的没有变化,认为操作更新未成功,但实质上是已经更新过了。这就是经典的 ABA问题。

解决方法

  • 时间戳:
  • 加版本号:

2. 循环开销大

CAS 这种也是乐观锁,如果线程较多、资源抢占激烈、命中率低的情况下,不断的循环会不断的消耗资源。实现上,可以设置最大循环数,达到最大循环数还没有占有资源就自动放弃,避免无限的循环。

3. 最多只能保证一个共享变量的操作

CAS 最多只能操作一个共享变量,单体效率低。

原文 

https://juejin.im/post/5e7f4cdf6fb9a03c2f4df95e

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 深入理解Java多线程与并发框(第⑧篇)——深入理解:CAS

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址