原子性概念及原子类的工作原理-CAS机制
1、原子性概念
原子性是指一个操作是不可中断的,要么全部执行成功,要么全部执行失败,有着“同生共死”的感觉。即使在多个线程一起执行的时候,一个操作一旦开始,就不会被其它的线程干扰。
例如语句(a++)实际上包含了三个操作:
- 读取变量a的值
- 对a进行加1的操作
- 将计算后的值再赋值给变量a
像这三个操作就无法构成原子性操作。
2、原子类的工作原理-CAS机制
2.1 原子类概述
在java.util.concurrent.atomic包下定义了一些对“变量操作”的“原子类”,例:
- java.util.concurrent.atomic.AtomicInteger:对int变量操作的“原子类”;
- java.util.concurrent.atomic.AtomicLong:对long变量操作的“原子类”;
- java.util.concurrent.atomic.AtomicBoolean:对boolean变量操作的“原子类”;
像这些原子类都可以保证对变量操作的:原子性、有序性、可见性。
2.2 AtomicInteger类示例
我们可以通过AtomicInteger类,来看看原子类是如何使用的:
1.线程类:
public class MyThread extends Thread { public static volatile int a = 0; @Overridepublic void run() {for (int i = 0; i < 10000; i++) {//线程1:取出a的值a=0(被暂停)a++; //写回}System.out.println("修改完毕!"); } }
2.测试类:
public class Demo {public static void main(String[] args) throws InterruptedException {//1.启动两个线程 MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.start();t2.start();Thread.sleep(1000);System.out.println("获取a最终值:" + MyThread.a.get());} }
使用原子类对变量操作,无论程序运行多少次,其结果都是正确的!
2.3 原子类的工作原理
先来看一下调用过程
在Unsafe类中,调用了一个:compareAndSwapInt()方法,此方法的几个参数:
var1:传入的AtomicInteger对象
var2:AtommicInteger内部变量的偏移地址
var5:之前取出的AtomicInteger中的值;
var5 + var4:预期结果此方法使用了一种"比较并交换(Compare And Swap)"的机制,它会用var1和var2先获取内存AtomicInteger的值,然后和传入的,之前获取的值var5做一下比较,也就是比较当前内存的值和预期的值是否一致,如果一致就修改为var5 + var4,否则就继续循环,再次获取AtomicInteger中的值,再进行比较并交换,直至成功交换为止。
compareAndSwapInt()方法是"线程安全"的。我们假设两个线程交替运行的情况,看看它是怎样工作的:
- 初始AtomicInteger的值为0
- 线程A执行:var5 = this.getIntVolatile(var1,var2);获取的结果为:0
- 线程A被暂停
- 线程B执行:var5 = this.getIntVolatile(var1,var2);获取的结果为:0
- 线程B执行:this.compareAndSwapInt(var1,var2,var5,var5 + var4)
- 线程B成功将AtomicInteger中的值改为1
- 线程A恢复运行,执行:this.compareAndSwapInt(var1,var2,var5,var5 + var4)
- 此时线程A使用var1和var2从AtomicInteger中获取的值为:1,而传入的var5为0,比较失败,返回false,继续循环。
- 线程A执行:var5 = this.getIntVolatile(var1,var2);获取的结果为:1
- 线程A执行:this.compareAndSwapInt(var1,var2,var5,var5 + var4)
- 此时线程A使用var1和var2从AtomicInteger中获取的值为:1,而传入的var5为1,比较成功,将其修改为var5 + var4,也就是2,将AtomicInteger中的值改为2,结束。
CAS机制也被称为:乐观锁。因为大部分比较的结果为true,就直接修改了。只有少部分多线程并发的情况会导致CAS失败,而再次循环。
2.4 如何描述原子类的执行流程及原理?
说到原子类,Java中提供了一些基本数据类型对应的原子类和一些引用数据类型对应的原子类,我们在平常使用变量或者一些引用数据类型的时候,如果考虑到多线程场景,一定要想到原子性问题,这里我就简单用经常使用的AtomicInteger举个例子说明,假如有多个线程在同时访问一个共享变量的时候,为了保证原子性,我们会采用AtomicInteger原子类来操作变量,如果要让变量实现自增操作,那我们就使用AtomicInteger提供的内部方法getAndIncrement()来进行自增!
- 此时假如A线程在操作共享变量,同时B线程也去操作变量,都会执行AtomicInteger提供的自增方法getAndIncrement() ,再调用Unsafe中的getAndAddInt(this,valueOffset,1) 。
- 参数 this代表当前对象( AtomicInteger类的对象)
- valueOffset代表AtomicInteger内部变量的偏移地址
- 1代表自增量
- 接着执行getAndAddInt() ,这个方法中是能够解决原子性问题的关键所在,这个方法的主体结构是由 一个变量 var5 和一个 do…while 循环体组成。
- 通过代码分析,首先do当中的代码块一定会执行(根据参数this,valueOffset)获取一下共享变量的当前值,这个动作就相当于拍一个快照做一下记录。接下来就执行while条件判断 (仔细观察发现while条件中调用了一个叫做compareAndSwapInt(有四个参数) ,这个方法的体现的本质是把共享内存的变量值再获取一遍,然后和刚刚记录的快照进行对比,如果对比一样,那就完成自增1返回true,如果不一样返回false,继续执行do中的代码,就是把共享变量的最新的值再记录一次快照,以备下一次比较使用), 以此类推这种机制叫做CAS机制,即比较后,通过比较的结果来决定是否对共享变量进行修改!
原子性概念及原子类的工作原理-CAS机制相关推荐
- Java多线程学习二十六:原子类是如何利用 CAS 保证线程安全的?
什么是原子类,以及它有什么作用. 在编程领域里,原子性意味着"一组操作要么全都操作成功,要么全都失败,不能只操作成功其中的一部分".而 java.util.concurrent.a ...
- Spring MVC的工作原理和机制
Spring MVC的工作原理和机制 参考: springMVC 的工作原理和机制 - 孤鸿子 - 博客园 https://www.cnblogs.com/zbf1214/p/5265117.htm ...
- IPFS系列 - 工作原理和机制
IPFS的工作原理和机制 (1) IPFS为每⼀个文件分配一个独一无⼆的哈希值(文件指纹:根据文件的内容进行创建),即使是两个文件内容只有1个比特的不相同,其哈希值也不相同.这个方式使得IPFS可以支 ...
- 1、Java中“并发编程”详解【voliate、synchronized、JMM内存模型、原子类操作Atomic..、CAS原理】
文章目录 1.对volatile 的理解? JMM(Java 内存模型) JMM模型的三大特性: 禁止指令排序 线程安全性保证 你在哪些地方用到过 volatile?单例 2.CAS 你知道吗?CAS ...
- 「死磕Java并发编程」说说Java Atomic 原子类的实现原理
<死磕 Java 并发编程>系列连载中,大家可以关注一波. 「死磕 Java 并发编程」阿里二面,面试官:说说 Java CAS 原理? 「死磕 Java 并发编程」面试官:说说什么是 J ...
- 高并发编程-07-JDK提供的原子类操作及原理
1,原子类介绍: 针对数据类型的操作,JDK提供的原子类来方便我们的线程安全控制. 所有的类保存在 java.util.concurrent.atomic 包中 基本数据类型 AtomicIntege ...
- FPGA概念、芯片结构、工作原理、开发流程以及xilinx公司主要可编程芯片
一.FPGA概念 可编程逻辑器件(Programmable Logic Device,PLD) 专用集成电路(Application Specific Integrated Circuit,ASIC) ...
- 处理器关于多核概念与区别 多核处理器工作原理及优缺点
+关注 摘要:目前关于处理器的单核.双核和多核已经得到了普遍的运用,今天我们主要说说关于多核处理器的一些相关概念,它的工作与那里以及优缺点而展开的分析. 1.多核处理器 多核处理器是指在一枚处理器中集 ...
- springMVC 的工作原理和机制
转载自 https://www.cnblogs.com/zbf1214/p/5265117.html 工作原理 上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器, ...
最新文章
- Failed to load AppCompat ActionBar with unknown error
- 基于HTML5的WebGL结合Box2DJS物理应用
- 网络管理技术(Network Administrative Techniques)
- SizeOf与Structure与Managed Code
- 说了这么多次 I/O,可你知道其中的原理么
- python+requests+re匹配抓取猫眼上映电影信息
- sql 外连接的写法。
- 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程)
- 阿里专家分享:企业级大数据轻量云实践
- three.js script vertex和fragment在react中使用/纯js写法
- oracle ocm 考题,2012年10 月oracle 10g ocm 认证 考试 真题 题库
- Hanoi Tower 模拟
- 1.3—Spring基础配置—3.AOP
- 谷歌SEO是什么意思,谷歌搜索引擎优化怎么做
- abaqus2020安装教程
- python模板是什么意思_python – 这个模板中的正确包含路径是什么?
- 使用Tale搭建个人博客网站(基于java)
- 关于将Ubuntu下中文目录修改为英文的解决方案
- C++ P1082 同余方程
- NYOJ-999-师傅又被妖怪抓走了
热门文章
- Web3.0这个故事,要从《大教堂与市集》讲起
- 电脑蓝屏和黑屏原因及处理方法
- Beehive UVALive - 7528 (找规律+数学思维)
- 服务器加载局域网硬盘,大师练习win7系统电脑添加网络驱动器和局域网服务器硬盘的还原教程...
- 2022年R1快开门式压力容器操作上岗证题库及模拟考试
- ActiveMQ学习笔记
- Beta版:产品(驱动、BIOS)发布之前的测试版本,也叫做β版,与此对应的还有α版(Alpha版)。α版通常是软件开发商内部自行测试的版本,而β版则是公开发布让用户来进行测试的版本。
- [读书笔记]1980年代的爱情-野夫
- 医生告诉你,感染了幽门螺旋杆菌该这样做
- 计算机毕业设计 SSM网上服装商城系统 服装定制商城系统 服装定制信息管理系统Java