atomic原子类实现机制_JDK中Atomic开头的原子类实现原子性的原理是什么?
JDK Atomic开头的类,是通过 CAS 原理解决并发情况下原子性问题。
CAS 包含 3 个参数,CAS(V, E, N)。V 表示需要更新的变量,E 表示变量当前期望值,N 表示更新为的值。只有当变量 V 的值等于 E 时,变量 V 的值才会被更新为 N。如果变量 V 的值不等于 E ,说明变量 V 的值已经被更新过,当前线程什么也不做,返回更新失败。
当多个线程同时使用 CAS 更新一个变量时,只有一个线程可以更新成功,其他都失败。失败的线程不会被挂起,可以继续重试 CAS,也可以放弃操作。
CAS 操作的原子性是通过 CPU 单条指令完成而保障的。JDK 中是通过 Unsafe 类中的 API 完成的。
在并发量很高的情况,会有大量 CAS 更新失败,所以需要慎用。
未使用原子类,测试代码
package constxiong.interview;/**
* JDK 原子类测试
* @author ConstXiong
* @date 2019-06-11 11:22:01*/
public classTestAtomic {private int count = 0;public intgetAndIncrement() {return count++;
}//private AtomicInteger count = new AtomicInteger(0);//
//public int getAndIncrement() {//return count.getAndIncrement();//}
public static voidmain(String[] args) {
final TestAtomic test= newTestAtomic();for (int i = 0; i <3; i++) {newThread(){
@Overridepublic voidrun() {for (int j = 0; j <10; j++) {try{
Thread.sleep(100);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "获取递增值:" +test.getAndIncrement());
}
}
}.start();
}
}
}
打印结果中,包含重复值
Thread-0 获取递增值:1
Thread-2 获取递增值:2
Thread-1 获取递增值:0
Thread-0 获取递增值:3
Thread-2 获取递增值:3
Thread-1 获取递增值:3
Thread-2 获取递增值:4
Thread-0 获取递增值:5
Thread-1 获取递增值:5
Thread-1 获取递增值:6
Thread-2 获取递增值:8
Thread-0 获取递增值:7
Thread-1 获取递增值:9
Thread-0 获取递增值:10
Thread-2 获取递增值:10
Thread-0 获取递增值:11
Thread-2 获取递增值:13
Thread-1 获取递增值:12
Thread-1 获取递增值:14
Thread-0 获取递增值:14
Thread-2 获取递增值:14
Thread-1 获取递增值:15
Thread-2 获取递增值:15
Thread-0 获取递增值:16
Thread-1 获取递增值:17
Thread-0 获取递增值:19
Thread-2 获取递增值:18
Thread-0 获取递增值:20
Thread-1 获取递增值:21
Thread-2 获取递增值:22
测试代码修改为原子类
package constxiong.interview;
import java.util.concurrent.atomic.AtomicInteger;/**
* JDK 原子类测试
* @author ConstXiong
* @date 2019-06-11 11:22:01*/
public classTestAtomic {//private int count = 0;//
//public int getAndIncrement() {//return count++;//}
private AtomicInteger count = new AtomicInteger(0);public intgetAndIncrement() {returncount.getAndIncrement();
}public static voidmain(String[] args) {
final TestAtomic test= newTestAtomic();for (int i = 0; i <3; i++) {newThread(){
@Overridepublic voidrun() {for (int j = 0; j <10; j++) {try{
Thread.sleep(100);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "获取递增值:" +test.getAndIncrement());
}
}
}.start();
}
}
}
打印结果中,不包含重复值
Thread-0 获取递增值:1
Thread-2 获取递增值:2
Thread-1 获取递增值:0
Thread-0 获取递增值:3
Thread-1 获取递增值:4
Thread-2 获取递增值:5
Thread-0 获取递增值:6
Thread-1 获取递增值:7
Thread-2 获取递增值:8
Thread-0 获取递增值:9
Thread-2 获取递增值:10
Thread-1 获取递增值:11
Thread-0 获取递增值:12
Thread-1 获取递增值:13
Thread-2 获取递增值:14
Thread-0 获取递增值:15
Thread-1 获取递增值:16
Thread-2 获取递增值:17
Thread-0 获取递增值:18
Thread-1 获取递增值:19
Thread-2 获取递增值:20
Thread-0 获取递增值:21
Thread-2 获取递增值:23
Thread-1 获取递增值:22
Thread-0 获取递增值:24
Thread-1 获取递增值:25
Thread-2 获取递增值:26
Thread-0 获取递增值:27
Thread-2 获取递增值:28
Thread-1 获取递增值:29
所有资源资源汇总于公众号
atomic原子类实现机制_JDK中Atomic开头的原子类实现原子性的原理是什么?相关推荐
- java 父类强制转换为子类_[java]Java中父类强制转换成子类的原则
Java中父类强制转换成子类的原则:父类型的引用指向的是哪个子类的实例,就能转换成哪个子类的引用. 例: public class Test { public static void main(Str ...
- atomic原子类实现机制_JUC学习笔记--Atomic原子类
Atomic 原子操作类包 Atomic包 主要是在多线程环境下,无锁的进行原子操作.核心操作是基于UnSafe类实现的CAS方法 CAS CAS: compareAndSwap :传入两个值:期望值 ...
- atomic原子类实现机制_并发编程:并发操作原子类Atomic以及CAS的ABA问题
本文基于JDK1.8 Atomic原子类 原子类是具有原子操作特征的类. 原子类存在于java.util.concurrent.atmic包下. 根据操作的数据类型,原子类可以分为以下几类. 基本类型 ...
- OS中atomic的实现解析
OS中atomic的实现解析 转自:http://my.oschina.net/majiage/blog/267409 摘要 atomic属性线程安全,会增加一定开销,但有些时候必须自定义atomi ...
- Java并发编程包中atomic的实现原理
转载自 Java并发编程包中atomic的实现原理 这是一篇来自粉丝的投稿,作者[林湾村龙猫]最近在阅读Java源码,这一篇是他关于并发包中atomic类的源码阅读的总结.Hollis做了一点点修 ...
- Multi-thread--C++11中atomic的使用
原子库为细粒度的原子操作提供组件,允许无锁并发编程.涉及同一对象的每个原子操作,相对于任何其他原子操作是不可分的.原子对象不具有数据竞争(data race).原子类型对象的主要特点就是从不同线程访问 ...
- java 原子类能做什么_死磕 java原子类之终结篇(面试题)
概览 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换. 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割 ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...
- java jdk 类加载机制_JDK源码阅读之类加载
java类加载 类的生命周期(类加载过程) LLIUU+VPR 加载(Loading) 链接(Linking) 验证(Verification) 准备(Preparation) 解析(Resoluti ...
最新文章
- centos7.0 安装nginx
- Xamarin Android教程Android基本知识版本介绍与系统介绍
- opencv图片处理和摄像头边缘检测
- 《Stellaris》游戏分析报告
- android 如何监听应用前后台切换
- 最新优秀的通用Android应用架构:从建项目开始
- linux moveto回收站,linux添加回收站(脚本)
- Linux下的SecureCRT破解方法
- grpcio安装不了
- 基于ssm汽车4s店维修保养试驾服务管理系统 java毕设项目介绍
- 综合项目之闪讯破解(五)之 如何用C#调用C++编写的Dll
- 艾美智能影库服务器ip,家庭影院播放器;影库 篇一:艾美影库MS-300 到底怎么样?...
- 计算机被老师关闭网络了,电脑被老师控制如何解控
- 闭环思维拉开人生差距
- 上海-亚马逊AWS联合创新中心正式启用
- 各种二维码介绍(锐浪报表)
- apk自动升级,高于android N自动安装不弹框的问题解决
- 修改Ubuntu和win10双系统启动顺序
- ASP.NET操作EXCEL时出现的错误 Retrieving the COM class factory for component with CLSID
- deployment is out of date due to changes in tho underlying project contents
热门文章
- 如何正确 Get 分库分表?
- 你还在抱怨开发工具,为什么不动手优化? | 人物志
- 小程序多端框架全面测评 | 程序员硬核评测
- AI 删库,程序员背锅?
- java 暂停等返回值在执行_java面试技巧(2)
- java vlan端口配置_HCIP之VLAN的配置
- java面向对象笔试_Java面向对象笔试题.doc
- jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用
- mysql新增字段会锁表_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...
- python中的numpy模块和pandas模块的区别_python的numpy模块- 01.pandas基本数据类型