Java并发编程之CAS第一篇-什么是CAS
Java并发编程之CAS第一篇-什么是CAS
通过前面几篇的学习,我们对并发编程两个高频知识点了解了其中的一个—volatitl。从这一篇文章开始,我们将要学习另一个知识点—CAS.本篇是《凯哥并发编程学习》系列之《CAS系列》教程的第一篇:什么是CAS。
本文主要内容:
生活中举例;CAS定义;CAS代码演示。
一:生活中的例子
在电影《智取威虎山》中,杨子荣进入威虎山的时候,土匪说:天王盖地虎,杨子荣对:宝塔镇河妖。类似这样的黑话,几个土匪和杨子荣对过之后,座山雕,三爷才发话:这么说,你是徐旅长的人了。相信电影中这段对黑话,大家都看过。有没有感觉很过瘾呢?那么问题来了,为什么几个人对过黑话之后,就能确定来者身份呢?因为在那个时候,占山为王,各个山头都有老大,但是又要和其他山头交流,不能用明话来说。于是大家就编了一些黑话。根据黑话不同,来确认对方的身份。
这个过程如果站在计算机多线程并发编程角度来理解的话,可以这么来理解。黑话库就是主内存中变量杨子荣和其他土F是不同的线程。,他们之间的黑话就是各自从主内存复制的变量副本。当T匪A(也就是线程A):天王盖地虎是自己的副本的数据,想要更新为:宝塔镇河妖。当杨子荣回答后,T匪A就拿着,天王盖地虎,宝塔镇河妖,这句话和黑话库(主内存)对比,对比上,则说明杨子荣说的对。允许接下来对话。如果这个不好理解的话,我们在举个例子。
修改登陆密码,这个大家都操作过吧。无论是各个APP还是各地网站都支持修改密码。那么修改密码的三要素是什么大家知道吗:数据库存储的原秘密;用户输入的原秘密;以及将要更新的密码。数据存储的原秘密(主内存),用户输入的原秘密(线程副本)。当数据库中存储的和用户输入的原密码对比相同的时候,才可以将原密码更新为新密码。否则就不能更新。
从上面两个例子我们可以看到,要想成功,需要三个变量:主内存变量值、线程自己工作区副本值以及要更新的数据值。如果有了上面三个概念,我们就来看看什么是CAS
二:什么是CAS
CAS定义:
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这个类来演示。代码如下图:
问题:
在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源码追根溯源吧。

Java并发编程之CAS第一篇-什么是CAS的更多相关文章
- Java并发编程之CAS第三篇-CAS的缺点及解决办法
Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...
- Java并发编程之CAS二源码追根溯源
Java并发编程之CAS二源码追根溯源 在上一篇文章中,我们知道了什么是CAS以及CAS的执行流程,在本篇文章中,我们将跟着源码一步一步的查看CAS最底层实现原理. 本篇是<凯哥(凯哥Java: ...
- Java并发编程之CAS
CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替 ...
- Java并发编程之set集合的线程安全类你知道吗
Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是<凯哥(凯哥Java:kagejava)并发编程学习> ...
- Java并发编程之AQS
一.什么是AQS AQS(AbstractQueuedSynchronize:队列同步器)是用来构建锁或者其他同步组件的基础框架,很多同步类都是在它的基础上实现的,比如常用的ReentrantLock ...
- Java 并发编程之 Condition 接口
本文部分摘自<Java 并发编程的艺术> 概述 任意一个 Java 对象,都拥有一个监视器方法,主要包括 wait().wait(long timeout).notify() 以及 not ...
- Java并发编程之Lock
重入锁ReentrantLock 可以代替synchronized, 但synchronized更灵活. 但是, 必须必须必须要手动释放锁. try { lock.lock(); } finally ...
- Java并发编程之synchronized关键字
整理一下synchronized关键字相关的知识点. 在多线程并发编程中synchronized扮演着相当重要的角色,synchronized关键字是用来控制线程同步的,可以保证在同一个时刻,只有一个 ...
- Java并发编程之volatile关键字解析
一内存模型的相关概念 二并发编程中的三个概念 三Java内存模型 四深入剖析volatile关键字 五使用volatile关键字的场景 volatile这个关键字可能很多朋友都听说过,或许也都用过.在 ...
随机推荐
- 算法设计与分析-Week12
题目描述 You are given coins of different denominations and a total amount of money amount. Write a func ...
- 如何安装与配置MySQL
关键词:MySQL,安装,配置 这一节,我们讨论一下MySQL的安装配置与卸载 下载 网址:https://dev.mysql.com/downloads/mysql/ 选择社区版,找到对应的电脑,开 ...
- fastcgi_param详解
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRI ...
- CSS中怎么设置元素水平垂直居中?
记录怎么使用text-align与vertical-align属性设置元素在容器中垂直居中对齐.text-align与vertical-align虽然都是设置元素内部对齐方式的,但两者的用法还是有略微 ...
- C++走向远洋——23(项目一,三角形,类)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...
- AAAI 2020论文分享:通过识别和翻译交互打造更优的语音翻译模型
2月初,AAAI 2020在美国纽约拉开了帷幕.本届大会百度共有28篇论文被收录.本文将对其中的机器翻译领域入选论文<Synchronous Speech Recognition and Spe ...
- maven笔记--持续更新
笔记: 在创建maven项目的时候,如果用到servlet的时候,需要导入包,这时候,需要导入本地仓库的jar包,即依赖包.语法如下 <dependency> <groupId> ...
- sql -- 多表关联,update(用户奖励)
表设计: users_buy: users_score: 需求: 1.根据用户分组,找出用户消费最高的金额 select user_name, max(paymoney) as pm from use ...
- Android系统研究资料收集---站在前人的肩膀上
Android系统研究资料收集---站在前人的肩膀上 针对Android系统研究任务,收集高价值资料在本页更新 AuthBlog:秋城https://www.cnblogs.com/houser032 ...
- idea 报Сannot Run Git runnerw.exe: AttachConsole failed with error 6
报错:Сannot Run Git runnerw.exe: AttachConsole failed with error 6 解决方案:指向Git 的git.exe文件所在的安装目录,配置上就可以 ...