Java并发编程之CAS第一篇-什么是CASjava
经过前面几篇的学习,咱们对并发编程两个高频知识点了解了其中的一个—volatitl。从这一篇文章开始,咱们将要学习另外一个知识点—CAS.本篇是《凯哥并发编程学习》系列之《CAS系列》教程的第一篇:什么是CAS。算法
本文主要内容:数据库
生活中举例;CAS定义;CAS代码演示。编程
在电影《智取威虎山》中,杨子荣进入威虎山的时候,土匪说:天王盖地虎,杨子荣对:宝塔镇河妖。相似这样的黑话,几个土匪和杨子荣对过以后,座山雕,三爷才发话:这么说,你是徐旅长的人了。相信电影中这段对黑话,你们都看过。有没有感受很过瘾呢?那么问题来了,为何几我的对过黑话以后,就能肯定来者身份呢?由于在那个时候,占山为王,各个山头都有老大,可是又要和其余山头交流,不能用明话来讲。因而你们就编了一些黑话。根据黑话不一样,来确认对方的身份。多线程
这个过程若是站在计算机多线程并发编程角度来理解的话,能够这么来理解。黑话库就是主内存中变量杨子荣和其余土F是不一样的线程。,他们之间的黑话就是各自从主内存复制的变量副本。当T匪A(也就是线程A):天王盖地虎是本身的副本的数据,想要更新为:宝塔镇河妖。当杨子荣回答后,T匪A就拿着,天王盖地虎,宝塔镇河妖,这句话和黑话库(主内存)对比,对比上,则说明杨子荣说的对。容许接下来对话。若是这个很差理解的话,咱们在举个例子。并发
修改登录密码,这个你们都操做过吧。不管是各个APP仍是各地网站都支持修改密码。那么修改密码的三要素是什么你们知道吗:数据库存储的原秘密;用户输入的原秘密;以及将要更新的密码。数据存储的原秘密(主内存),用户输入的原秘密(线程副本)。当数据库中存储的和用户输入的原密码对比相同的时候,才能够将原密码更新为新密码。不然就不能更新。ide
从上面两个例子咱们能够看到,要想成功,须要三个变量:主内存变量值、线程本身工做区副本值以及要更新的数据值。若是有了上面三个概念,咱们就来看看什么是CAS性能
CAS:Compare and Swap 三个字母的缩写。学习
是什么意思呢?Compare:比较 Swap:交换。因此CAS即为:比较并交换的意思。网站
须要注意:and 是并的意思。在逻辑运算中,并的意思:只有都成立了才能够执行下面操做。
那么在Java并发中为何会大量的使用到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的最新值。我本身自旋操做,本身玩。
咱们知道在JUC下,有个原子包,就在atomic包下,咱们用来演示CAS代码就用AtomicInteger这个类来演示。代码以下图:
问题:
在12和13行,运行后的结果是什么呢?
true 运行后。当前i的值为:2020
false 运行后。当前i的值为:2020
为何会是这样呢?
咱们来分析:
在11行的时候,声明了变量i.并赋值为1(即V),而后第12行,拿着预期值1(即A),和将要更新的值2020(即B).进行CAS以后,由于1==1也就是V==A。这个中状况下,就会把2020从新赋值给V。因此,第12行输出的就是true和2020;
在第13行假设是线程2来访问。线程2本身工做空间变量副本依然是1,更行值是1024.这个时候进行CAS的时候,由于如今主内存V的值是2020,因此2020 != 1也就是V != A。这个时候,V的值不能被更新,因此第13行输出的是就是false和2020.
在看下面:
问题:第14行输出的是什么呢 ?
咱们来看看运行结果:
为何呢?你们能够尝试这去分析分析。(PS:提示,看看上文CAS定义和CAS操做流程来分析)。
在下一节中,凯哥(凯哥Java:kaigejava)将和你们唠唠CAS的原理。为何,若是不加锁的话,volatile不能保证原子性,可是atomic包下的类就能够保证原子性呢?咱们从AtomicInteger源码追根溯源吧。