对CAS的理解
创始人
2024-05-16 13:57:28
0

CAS的概念(compare and swap):比较并交换

我们首先要明白,自旋是一个纯用户态的操作,本身并没有进行加锁,所执行的代码,是在并发环境下执行的,没有锁。

我们举一个例子来说明自旋加CAS的作用:

我们画一个时间图来接着证明:

线程中的Load和CAS的load并不一样,线程中的Load是获取预期值,而CAS中的load是在主内存中获取值,与预期值进行比较,两者作用并不相同。我们发现CAS并不是一个操作,首先要进行预期值和主内存中的值的比较,如果相同再进行下一步的操作,不相同则重新自旋+CAS,伪代码如下,按理说应该对应着许多条cpu指令,但是事实上它只对应着一条cpu指令(cmpxchg),一条指令可以完成所有操作,这条指令对应着系统的一个API,这个API有三个参数:地址值,预期值和要修改的值,但是我们必须要明白的是CAS的实现是通过cpu硬件提供的lock机制保证其原子性,简而言之就是因为硬件层面给予了支持,软件层面才能达到。

注意:CAS最重要的是判断我们第一次获取到的预期值和主内存中的值是否一致,也就是说数据是否在我们获取完预期值之后被其他线程修改过,没有修改过我们在此基础上进行的修改和写回操作是线程安全的,如果被修改过,此时我们再进行的修改和写回操作可能覆盖之前修改的值,这是线程不安全的。

CAS的两个应用:

①实现自旋锁:

伪代码如下:

②实现原子类

我们关于原子类的代码如下:

public class demo1001 {public static void main(String[] args) throws InterruptedException {//创建基于CAS的原子类AtomicInteger atomicInteger = new AtomicInteger();//创建两个线程实现自增操作Thread t1 =new Thread(()->{for (int i = 0; i <50000 ; i++) {atomicInteger.getAndIncrement();}});Thread t2 =new Thread(()->{for (int i = 0; i <50000 ; i++) {atomicInteger.getAndIncrement();}});//两个线程均开始执行t1.start();t2.start();//等待两个线程均执行结束t1.join();t2.join();System.out.println(atomicInteger);}
}

在这段代码中,我们并没有使用synchronized进行上锁,但是结果仍然是正确的

我们查看其源码:

关于CAS中的ABA问题:

ABA 的问题:

假设存在两个线程 t1 和 t2. 有一个共享变量 num, 初始值为 A.

接下来, 线程 t1 想使用 CAS 把 num 值改成 Z, 那么就需要

先读取 num 的值, 记录到 oldNum 变量中.

使用 CAS 判定当前 num 的值是否为 A, 如果为 A, 就修改成 Z.

但是, 在 t1 执行这两个操作之间, t2 线程可能把 num 的值从 A 改成了 B, 又从 B 改成了 A线程 t1 的 CAS 是期望 num 不变就修改. 但是 num 的值已经被 t2 给改了. 只不过又改成 A 了. 这个时候 t1是否要更新值为Z呢?

那在实际生活中我们举这样一个例子:

虽然从值的大小来看虽然是一样的,但是从操作过程和逻辑上来说有着很大的区别,可以说是两个完全不同的结果,那么我们又该如何解决这个ABA问题呢?

答案很简单,增加一个版本号,当有人对这个数据操作之后,该数据的版本号加1,虽然结果一致,但是我们可以通过版本号来判断这个结果是否是我们期望的结果

相关内容

热门资讯

安卓系统相册软件下载,下载与使... 手机里的相册是不是已经满满当当,想要给它们找个新家?别急,今天就来给你安利几款超好用的安卓系统相册软...
安卓9系统优化软件,解锁流畅体... 你有没有发现,自从你的安卓手机升级到了安卓9系统,运行速度好像变得更快了?是不是觉得手机变得更加流畅...
各厂商安卓系统对比,性能、特色... 你有没有发现,现在手机市场上安卓系统的竞争可是相当激烈呢!各大厂商纷纷推出自己的特色系统,让人眼花缭...
车机进入安卓系统,智能驾驶体验... 你有没有发现,最近你的车机系统好像变得不一样了?没错,车机系统正在悄悄地进入安卓的大家庭!这可不是什...
安卓系统自带壁纸高清,自带高清... 亲爱的手机控们,你是否曾为安卓系统自带的那些高清壁纸而驻足欣赏?那些色彩斑斓、风格迥异的画面,是不是...
安卓机换成钟表系统,探索智能穿... 你有没有想过,你的安卓手机其实也可以换上钟表系统呢?是的,你没听错,就是那种优雅、简洁、充满艺术感的...
安卓lcs操作系统,轻量级、安... 你知道吗?在智能手机的世界里,有一个操作系统可是相当出名的,那就是安卓LCS操作系统。它就像一位魔法...
安卓系统微信包月,畅享无限制沟... 你知道吗?在咱们这个手机不离手的年代,微信可是咱们日常生活中不可或缺的好帮手。不过,你知道吗?安卓系...
我想换安卓系统,系统升级换新体... 亲爱的读者,你是否也有过这样的冲动?看着身边的朋友纷纷换上了安卓系统,心里痒痒的,也想尝试一下?没错...
用了苹果换安卓系统,系统更迭背... 你知道吗?最近我可是经历了一场大变身呢!是的,你没听错,我用苹果手机换成了安卓系统。这可不是一个小决...
手机刷机系统安卓,解锁手机潜能... 你有没有想过,你的手机是不是已经有点儿“老态龙钟”了呢?别急,别急,今天就来给你揭秘如何给手机来个焕...
安卓pe10系统,功能与特色深... 你有没有听说最近安卓PE10系统火得一塌糊涂?没错,就是那个让无数手机用户为之疯狂的系统。今天,我就...
安卓系统程序安装目录,安卓系统... 你有没有想过,当你手机里安装了一个又一个应用程序时,它们都藏在哪里呢?没错,就是那个神秘的安卓系统程...
ios系统能定位安卓系统吗,i... 你有没有想过,你的iPhone和安卓手机之间竟然能玩出这么一出“追踪大戏”?没错,我要说的就是那个让...
安卓系统时间放到桌面,桌面概览... 你有没有发现,手机上的时间有时候会偷偷跑得飞快,让你不知不觉就错过了重要的事情?别急,今天就来教你怎...
安卓系统怎么刷win,体验全新... 你有没有想过,把你的安卓手机变成一台Windows电脑呢?听起来是不是有点不可思议?但别急,今天我就...
安卓仿苹果系统设置,打造极致用... 你有没有发现,现在越来越多的安卓手机开始模仿苹果的操作系统了?没错,就是那个简洁又好用的设置界面!今...
emui 安卓系统对应关系,E... 你有没有发现,每次打开你的华为手机,那个界面看起来是不是特别顺眼?那是因为华为的EMUI系统,它就像...
永诺安卓系统相机,功能解析与使... 你有没有发现,手机拍照已经成为我们生活中不可或缺的一部分?而在这其中,永诺安卓系统的相机功能可是相当...
tinder安卓版系统错误,揭... 最近在使用Tinder安卓版的时候,你是不是也遇到了一些让人头疼的系统错误呢?别急,今天就来和你聊聊...