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并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述...
《Java高并发编程》第一版是一本专注于...通过阅读《Java高并发编程》第一版,开发者不仅可以掌握Java并发编程的核心概念和技术,还能了解到如何在实际工作中设计和实现高效、安全的并发程序,提升系统的并发处理能力。
│ 高并发编程第一阶段02讲、简单介绍什么是线程.wmv │ 高并发编程第一阶段03讲、创建并启动线程.mp4 │ 高并发编程第一阶段04讲、线程生命周期以及start方法源码剖析.mp4 │ 高并发编程第一阶段05讲、采用多...
1. **第一章:并发基础** - 并发的概念:并发是指在单个执行单元(如CPU)上同时执行多个任务,通过时间片轮转或多核处理实现。 - 线程与进程:线程是操作系统调度的基本单位,而进程是资源分配的最小单位。 - ...
《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java平台上的多线程和并发编程的著作。本书旨在帮助开发者理解和掌握在Java环境中进行高效并发处理的关键技术与设计模式。以下是对该书内容的一些核心知识...
│ 高并发编程第一阶段02讲、简单介绍什么是线程.wmv │ 高并发编程第一阶段03讲、创建并启动线程.mp4 │ 高并发编程第一阶段04讲、线程生命周期以及start方法源码剖析.mp4 │ 高并发编程第一阶段05讲、采用多...
这本书涵盖了Java并发编程的核心概念和技术,旨在帮助开发者在实际项目中高效地处理高并发场景。随书附带的代码提供了丰富的示例,以便读者能够更直观地理解并实践这些理论知识。 1. **Java并发基础** - **线程与...
《Java并发编程之美》第7章中,我们深入探讨了Java并发包中的并发队列原理,特别是从尾节点进行插入这一关键操作。在Java并发队列中,offer()方法用于在队列尾部添加元素,它是线程安全的,主要依赖于CAS(Compare ...
Java并发编程实践中,第八章主要探讨了原子变量和非阻塞算法在处理并发问题时的重要性和优势,以克服传统锁机制的局限性。锁在多线程环境下提供了对共享资源的互斥访问,但同时也存在一些明显的劣势。 首先,锁的...
Java并发编程实战 本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及...
在进行 CAS 操作时,如果在第一次读取 V 之后以及对 V 执行 CAS 操作之前,如果将值从 A 改为 B,然后再改回 A,会使基于 CAS 的算法混乱。这种情况下,CAS 操作会成功。 Collections 中的 HashMap、HashTable 和 ...
Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...
`Future`接口提供了获取异步计算结果的能力,它是Java并发编程中重要的API之一。 ##### 3.1 FutureTask `FutureTask`是`Future`接口的一个具体实现,它可以包装一个`Runnable`或`Callable`对象,并允许用户获取...
### 第一章 线程基础、共享与协作 1. **进程与线程**:进程是程序在操作系统中的一个实例,拥有独立的资源;线程则是进程内的执行单元,共享进程资源,通信更高效。 2. **CPU核心与线程关系**:多核CPU可以同时处理...
Java-JUC-多线程进阶resources是 Java 并发编程的高级课程,涵盖了 Java 中的并发编程概念、线程安全、锁机制、集合类、线程池、函数式接口、Stream流式计算等多个方面。 什么是JUC JUC(Java Utilities for ...
Java并发之AQS详解 AbstractQueuedSynchronizer(AQS)是 Java 并发编程中的一个核心组件,提供了一套多线程访问共享资源的同步器框架。AQS 定义了两种资源共享方式:Exclusive(独占)和 Share(共享)。在 AQS 中...
Java并发编程中的synchronized关键字是实现线程安全的重要工具,它提供了一种互斥访问机制,确保了共享数据在同一时刻只能被一个线程访问。synchronized关键字有三种主要的应用方式: 1. 修饰实例方法:当...
#### 一、Java并发编程基础 - **基础知识:** - **线程基本概念:** Java线程是程序执行流的最小单元,一个线程包含一个程序计数器(PC)、虚拟机栈、本地方法栈、线程私有的工作内存。 - **线程生命周期:** 包括`...
"04 并发编程专题06.zip"这个压缩包文件包含了两个部分:"JMM&volatile详解(下)(1).vep"和"JMM&volatile详解(下)(2).vep",它们着重探讨了Java内存模型(JMM)以及volatile关键字的深入理解。 Java内存模型...