『编程』Java并发编程之CAS第一篇理解


『编程』Java并发编程之CAS第一篇理解
文章图片
『编程』Java并发编程之CAS第一篇理解
文章图片
Java并发编程之CAS第一篇-什么是CAS
通过前面几篇的学习 , 我们对并发编程两个高频知识点了解了其中的一个—volatitl 。 从这一篇文章开始 , 我们将要学习另一个知识点—CAS.本篇是《凯哥并发编程学习》系列之《CAS系列》教程的第一篇:什么是CAS 。
本文主要内容:
生活中举例;CAS定义;CAS代码演示 。
一:生活中的例子在电影《智取威虎山》中 , 杨子荣进入威虎山的时候 , 土匪说:天王盖地虎 , 杨子荣对:宝塔镇河妖 。 类似这样的黑话 , 几个土匪和杨子荣对过之后 , 座山雕 , 三爷才发话:这么说 , 你是徐旅长的人了 。 相信电影中这段对黑话 , 大家都看过 。 有没有感觉很过瘾呢?那么问题来了 , 为什么几个人对过黑话之后 , 就能确定来者身份呢?因为在那个时候 , 占山为王 , 各个山头都有老大 , 但是又要和其他山头交流 , 不能用明话来说 。 于是大家就编了一些黑话 。 根据黑话不同 , 来确认对方的身份 。
这个过程如果站在计算机多线程并发编程角度来理解的话 , 可以这么来理解 。 黑话库就是主内存中变量杨子荣和其他土F是不同的线程 。, 他们之间的黑话就是各自从主内存复制的变量副本 。 当T匪A(也就是线程A):天王盖地虎是自己的副本的数据 , 想要更新为:宝塔镇河妖 。 当杨子荣回答后 , T匪A就拿着 , 天王盖地虎宝塔镇河妖 , 这句话和黑话库(主内存)对比 , 对比上 , 则说明杨子荣说的对 。 允许接下来对话 。 如果这个不好理解的话 , 我们在举个例子 。
修改登陆密码 , 这个大家都操作过吧 。 无论是各个APP还是各地网站都支持修改密码 。 那么修改密码的三要素是什么大家知道吗:数据库存储的原秘密;用户输入的原秘密;以及将要更新的密码 。 数据存储的原秘密(主内存) , 用户输入的原秘密(线程副本) 。 当数据库中存储的和用户输入的原密码对比相同的时候 , 才可以将原密码更新为新密码 。 否则就不能更新 。
从上面两个例子我们可以看到 , 要想成功 , 需要三个变量:主内存变量值、线程自己工作区副本值以及要更新的数据值 。 如果有了上面三个概念 , 我们就来看看什么是CAS
二:什么是CASCAS定义:CAS:Compare and Swap 三个字母的缩写 。
是什么意思呢?Compare:比较 Swap:交换 。 所以CAS即为:比较并交换的意思 。
需要注意:and 是并的意思 。 在逻辑运算中 , 并的意思:只有都成立了才可以执行下面操作 。
那么在Java并发中为什么会大量的使用到CAS呢?
那是因为CAS是无锁的一种算法 。 为了解决多线程并行(并发)情况下使用锁的话 , 性能消耗的一种机制 。
CAS操作流程:CAS操作包含了三个操作数据 。 分别是:主内存数据值或主内存位置(V)、线程工作区副本更新前的数据值或者是预期值(A)以及要更新成的新值(B) 。
操作流程:
线程M在更新的共享变量的时候 , 会拿着自己工作区变量副本A的值假设是1 , 将要更新的值B 。 假设是2.去更新主内存共享变量V的时候 , 会先拿着V和A比较 。 如果V==A的时候 , 才会将主内存V的值换成B 。 否则就会重新获取主内存的值 , 进行自旋操作 , 知道成功位置 。
简单理解:我(线程M , 工作区值为A)认为主内存V中的共享变量值是(包含)A , 如果 V的值是A , 那么就将B替换V 。 如果不是 , 就不更新V的值 , 只要告诉我V的最新值 。 我自己自旋操作 , 自己玩 。
三:CAS代码演示我们知道在JUC下 , 有个原子包 , 就在atomic包下 , 我们用来演示CAS代码就用AtomicInteger这个类来演示 。 代码如下图: