前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程(CAS)

多线程(CAS)

作者头像
全栈开发日记
发布2022-05-13 14:27:02
2420
发布2022-05-13 14:27:02
举报
文章被收录于专栏:全栈开发日记

大厂的面试题:什么是CAS?

CAS全称:Compare-And-Swap(比较 and 替换)。

CAS操作是乐观锁的一个实现,而synchronized则是悲观锁的一个实现。乐观锁和悲观锁后面再详细总结。

在日常开发中基本不会直接使用CAS操作,因为这个操作比较复杂,我们一般通过一些JDK封装好的并发工具类,这些类在java.util.concurrent包下,这个包下的工具类很多都用到了CAS操作。

以上就是CAS执行流程,当该线程开始后会先读取要修改的值E的当前值,然后再去执行操作(如自增、自减等),当执行完操作后再去判断当前E值和之前读取到的预期值A是否相同,如果不相同则再次获取当前值E继续以上流程,直到当前值与预期值相同,才会对当前值E做出修改,修改成功后该线程CAS操作结束。

以上CAS操作执行过程中又会引出一个新问题:ABA问题。

ABA问题

什么是ABA问题?

如果当前的值被修改多次后又改回了之前的预期值。即原值为A,被其他线程改为B后又被改为A。此时如果继续按照当前值与预期值的比较,结果肯定是符合修改的数据的条件,会把其他线程提交上来的数据覆盖掉,这就是ABA问题。

解决方法:给当前值E加一个版本号,每次被修改之后就版本号+1。这时,当前值与版本号搭配起来就不会出现ABA问题了。

CAS底层

java.util.concurrent包下工具类最底层是使用汇编语言实现,也就是机器语言,汇编语言使用lock cmpxchg指令,对当前值加锁并修改。防止在CAS操作中进行比较后,还没进行修改时E被其他线程修改,导致比较时候是没有变化,在赋值的时候被其他线程修改,防止覆盖其他线程修改后的数据。

其中lock命令的作用是在当前CPU或线程在比较修改当前值的时候,其他线程不能打断。

如有错误请指正,谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈开发日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ABA问题
  • CAS底层
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档