Java并发之原子变量及CAS算法-上篇
Java并发之原子变量及CAS算法-上篇
概述
本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中式怎么保证变量原子性的呢?。对应Java中的包是:java.util.concurrent.atomic包下。因为涉及到了CAS算法,需要对CAS算法讲解及CAS算法三个问题怎么解决以及和Synchroized比较。文章比较长,所以就分为上下两个篇幅讲解。本文是上篇《Java并发之原子变量及CAS算法-上篇》
本文是《凯哥分享Java并发编程之J.U.C包讲解》系列教程中的一篇。如果想系统学习,建议从第一篇开始看。
原子变量案例
在Java中有一种写法:int i = 10; i++ 这种写法。
我们先来看看:
输入的是0还是1呢 ?
I++输出0的原因分析
答案是:0。为什么呢?凯哥把编译后的class文件反编译,咱们看:
说明:i的操作是i++;y的操作是++y.
从反编译后的代码,我们可以看到i++在JVM中的操作,总共分三步:
第一步:声明变量var10000 ,然后将i赋值给var10000,此时var10000的值是0;
第二步:声明变量var3 然后把i+1 赋值给var3,此时,var3的值等于1了;
第三步:将变量var10000的值又赋值给了i,此时因为var10000的值是0,所以i的值也是0
所以在sysout(i)的时候,就输出了0.
我们分析上面1,2,3步骤,可以发现。其实i++执行的是:读取-修改-重写 三个操作。
既然读写操作,就会涉及到变量原子性。测试在多线程下变量原子性
测试多线程下的变量原子性
那么,如果我们把对i的操作放到多个线程中操作结果会是什么样的呢?
线程操作I的代码:
开启十个线程同时操作i的代码:
我们来看看运行结果:
从运行结果中,我们可以看到,线程Thread-5和线程Thread-8的值是一样的。
根据上面运行的场景,我们发现,变量i其实是十个线程中的共享变量。从运行的结果来看,多个线程操作后,结果出问题了。
不同线程在内存中运行模拟图:
线程1;线程2;以及主线程之间运行关系,可以详见凯哥上一篇文章:《Java并发之内存可见性问题怎么解决》。这篇文章详细讲解了怎么关系。
已经看过凯哥上一篇文章或者是知道volatile关键字的朋友可能要说,这不就是线程之间变量可见性问题嘛。使用volatile关键字修饰i就可以了。真的可以了吗?
我们修改程序,用volatile来修饰,看看运行结果:
使用volatile关键字是否能解决多线程情况下变量原子性呢?
用volatile来修饰变量:
private volatile int shardData = 0;
运行结果:
我们发现,就算使用volatile关键字修饰了,依然存在多线程下变量原子性的问题。
怎么解决这种并发下变量原子性问题呢?
Java的atomic包
在jdk1.5以后,Java为我们提供了一个常用的原子变量。都在:java.util.concureent.atomic包下。我们来看看,都有哪些:
从JDK的API文档中(凯哥使用的是JDK1.8的API)我们可以看到常用的原子性变量。
怎么保证原子性呢?
那么,在atomic包下的这些类怎么保证原子性呢?
1:该包下的变量都是使用volatile关键字来修饰。
解决了多线程之间变量可见性。
Int类型的原子性对象AtomicInteger对象中:
用于对象的AtomicReference对象中:
都是使用volat关键字修饰的。
2:使用CAS算法
保持了变量的原子性
总结:
在Java的JDK中提供了concurrent.atomic包,使用这个包下的对象创建的变量就能保证原子性。
保证原子性的策略:
1:变量都是用Volatile关键字修饰。来保证内存可见性
2:使用CAS算法,来保证原子性。
下篇预告:
在下一篇文章中,我们主要讲解CAS算法原理及CAS算法会参数哪些问题(三个问题)?JDK是怎么解决的?修改i++使其成为具有原子性变量怎么实现。
Java并发之原子变量及CAS算法-上篇的更多相关文章
- Java多线程-----原子变量和CAS算法
原子变量 原子变量保证了该变量的所有操作都是原子的,不会因为多线程的同时访问而导致脏数据的读取问题 Java给我们提供了以下几种原子类型: AtomicInteger和Ato ...
- 三、原子变量与CAS算法
原子变量:jdk1.5 后 java.util.concurrent.atomic 包下提供了常用的原子变量: - AtomicBoolean - AtomicInteger - AtomicLong ...
- 原子变量与CAS算法
原子变量 为了引出原子变量这个概念,我们先看一个例子. package com.ccfdod.juc; public class TestAtomicDemo { public static void ...
- 原子变量与CAS算法小结
CAS算法 CAS(compare-and-swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问. CAS是一种无锁非阻塞算法的实现. CAS ...
- volatile关键字与内存可见性&原子变量与CAS算法
1 .volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见 2 .原子变量:jdk1.5后java.util.concurrent.atomic 包下提供常用的原子变量 ...
- Java并发之原子变量和原子引用与volatile
我们知道在并发编程中,多个线程共享某个变量或者对象时,必须要进行同步.同步的包含两层作用:1)互斥访问(原子性):2)可见性:也就是多个线程对共享的变量互斥地访问,同时线程对共享变量的修改必须对其他线 ...
- 原子变量与CAS算法(二)
一.锁机制存在的问题 (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)如果一个优先级高的线程等待一个 ...
- Java编程的逻辑 (70) - 原子变量和CAS
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- java并发编程学习: 原子变量(CAS)
先上一段代码: package test; public class Program { public static int i = 0; private static class Next exte ...
- 计算机程序的思维逻辑 (70) - 原子变量和CAS
从本节开始,我们探讨Java并发工具包java.util.concurrent中的内容,本节先介绍最基本的原子变量及其背后的原理和思维. 原子变量 什么是原子变量?为什么需要它们呢? 在理解synch ...
随机推荐
- JavaScript -- 数据类型 --手稿
- SurveillanceStation破解版 SurveillanceStation-x86_64-8.2.2-5766
直接手动安装好套件,许可就是65535.安装的时候提示套件损坏,不理继续安装.不过这个版本有时间炸弹问题,使用几个小时后会出现摄像机消失问题,显示摄像机被删除,但是配置其实是在的.只要禁用套件再启用一 ...
- C++中的引用(Reference)
1. 引用(Reference) 在 C++ 中,引用(Reference)是一个变量的别名. 它允许你通过不同的名字访问同一个变量. 与指针不同,引用在定义时必须被初始化,并且一旦绑定到某个变量,之 ...
- Linux 文件夹和文件操作【Linux 常用命令系列一】
〇.前言 本文首先介绍了 Linux 中文件的结构,将全部文件夹罗列并介绍了大概的用途: 然后通过实例介绍了文件夹相关的常用操作,仅供参考. 一.Linux 系统的文件结构 列一下系统全部文件夹: / ...
- js需要同时发起百条接口请求怎么办?--通过Promise实现分批处理接口请求
如何通过 Promise 实现百条接口请求? 实际项目中遇到需要发起上百条Promise接口请求怎么办? 前言 不知你项目中有没有遇到过这样的情况,反正我的实际工作项目中真的遇到了这种玩意,一个接口获 ...
- [oeasy]python0105_七段数码管_7_SEGMENT_数码管驱动_4511
七位数码管 回忆上次内容 上次回顾了 指示灯 辉光管 并了解了 驱动(driver) 驱动 就是 控制设备 工作的人(模块) 辉光管离我们的生活很远了 添加图片注释,不超过 140 ...
- Known框架实战演练——进销存框架搭建
本文介绍如何使用Known开发框架搭建进销存管理系统的项目结构,以及开发前的一些配置和基础代码. 项目代码:JxcLite 开源地址: https://gitee.com/known/JxcLite ...
- IDEA整合Spring+Struts+Hibernate项目
新手使用idea整合Spring+Struts+Hibernate项目 项目所需jar下载: https://download.csdn.net/download/weixin_44906002/12 ...
- python 音频处理(1)——重采样、音高提取
采集数据->采样率调整 使用torchaudio进行重采样(cpu版) 首先导入相关包,既然使用torch作为我们的选项,安装torch环境我就不必多说了,如果你不想用torch可以使用后文提到 ...
- batch normalization的multi-GPU版本该怎么实现? 【Tensorflow 分布式PS/Worker模式下异步更新的情况】
最近由于实验室有了个AI计算平台,于是研究了些分布式和单机多GPU的深度学习代码,于是遇到了下面的讨论: https://www.zhihu.com/question/59321480/answer/ ...