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开头的原子类实现原子性的原理是什么?相关推荐

  1. java 父类强制转换为子类_[java]Java中父类强制转换成子类的原则

    Java中父类强制转换成子类的原则:父类型的引用指向的是哪个子类的实例,就能转换成哪个子类的引用. 例: public class Test { public static void main(Str ...

  2. atomic原子类实现机制_JUC学习笔记--Atomic原子类

    Atomic 原子操作类包 Atomic包 主要是在多线程环境下,无锁的进行原子操作.核心操作是基于UnSafe类实现的CAS方法 CAS CAS: compareAndSwap :传入两个值:期望值 ...

  3. atomic原子类实现机制_并发编程:并发操作原子类Atomic以及CAS的ABA问题

    本文基于JDK1.8 Atomic原子类 原子类是具有原子操作特征的类. 原子类存在于java.util.concurrent.atmic包下. 根据操作的数据类型,原子类可以分为以下几类. 基本类型 ...

  4. OS中atomic的实现解析

    OS中atomic的实现解析 转自:http://my.oschina.net/majiage/blog/267409  摘要 atomic属性线程安全,会增加一定开销,但有些时候必须自定义atomi ...

  5. Java并发编程包中atomic的实现原理

    转载自   Java并发编程包中atomic的实现原理 这是一篇来自粉丝的投稿,作者[林湾村龙猫]最近在阅读Java源码,这一篇是他关于并发包中atomic类的源码阅读的总结.Hollis做了一点点修 ...

  6. Multi-thread--C++11中atomic的使用

    原子库为细粒度的原子操作提供组件,允许无锁并发编程.涉及同一对象的每个原子操作,相对于任何其他原子操作是不可分的.原子对象不具有数据竞争(data race).原子类型对象的主要特点就是从不同线程访问 ...

  7. java 原子类能做什么_死磕 java原子类之终结篇(面试题)

    概览 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换. 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割 ...

  8. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...

  9. java jdk 类加载机制_JDK源码阅读之类加载

    java类加载 类的生命周期(类加载过程) LLIUU+VPR 加载(Loading) 链接(Linking) 验证(Verification) 准备(Preparation) 解析(Resoluti ...

最新文章

  1. centos7.0 安装nginx
  2. Xamarin Android教程Android基本知识版本介绍与系统介绍
  3. opencv图片处理和摄像头边缘检测
  4. 《Stellaris》游戏分析报告
  5. android 如何监听应用前后台切换
  6. 最新优秀的通用Android应用架构:从建项目开始
  7. linux moveto回收站,linux添加回收站(脚本)
  8. Linux下的SecureCRT破解方法
  9. grpcio安装不了
  10. 基于ssm汽车4s店维修保养试驾服务管理系统 java毕设项目介绍
  11. 综合项目之闪讯破解(五)之 如何用C#调用C++编写的Dll
  12. 艾美智能影库服务器ip,家庭影院播放器;影库 篇一:艾美影库MS-300 到底怎么样?...
  13. 计算机被老师关闭网络了,电脑被老师控制如何解控
  14. 闭环思维拉开人生差距
  15. 上海-亚马逊AWS联合创新中心正式启用
  16. 各种二维码介绍(锐浪报表)
  17. apk自动升级,高于android N自动安装不弹框的问题解决
  18. 修改Ubuntu和win10双系统启动顺序
  19. ASP.NET操作EXCEL时出现的错误 Retrieving the COM class factory for component with CLSID
  20. deployment is out of date due to changes in tho underlying project contents

热门文章

  1. 如何正确 Get 分库分表?
  2. 你还在抱怨开发工具,为什么不动手优化? | 人物志
  3. 小程序多端框架全面测评 | 程序员硬核评测
  4. AI 删库,程序员背锅?
  5. java 暂停等返回值在执行_java面试技巧(2)
  6. java vlan端口配置_HCIP之VLAN的配置
  7. java面向对象笔试_Java面向对象笔试题.doc
  8. jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用
  9. mysql新增字段会锁表_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...
  10. python中的numpy模块和pandas模块的区别_python的numpy模块- 01.pandas基本数据类型