吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1766|回复: 3
收起左侧

[Java 转载] 多线程-CAS

[复制链接]
二饭 发表于 2020-12-3 22:03

什么是CAS?

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

CAS.png

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

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

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

解决方式是:给当前值E加一个版本号,每次被修改之后就版本号+1。

CAS底层:

是使用汇编语言实现的,也就是机器语言,汇编语言使用lock cmpxchg指令,对当前值加锁并修改。防止在比较的时候,值被修改,导致比较时候是没有变化,在赋值的时候被其他线程修改,防止覆盖其他线程修复后的值。

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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

两只老虎 发表于 2020-12-4 09:19
加油加油
wanshiz 发表于 2020-12-4 09:22
chengpopeye 发表于 2020-12-4 20:50
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 22:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表