转载自https://blog.csdn.net/sdlyjzh/article/details/78587777

打算把Concurrent包下面的一些类整理一下。今天先从最简单的开始,Atomic原子类。

先看一下atomic包下的类 
 
一共12个,共分四类:基本类型、数组、引用、属性。我们就按这四个分类,介绍一下它们的用途以及实现。

基本类型

包含上图红框里面的三个类。由于三个类提供的方法基本一致,下面以AtomicInterger为例。 
AtomicInteger的常用方法如下: 
 
实现逻辑都差不多,取当前值current,然后计算更改后的值。利用CAS思想,比较current和当前数值是否相等,如果相等,则更新,如果不相等,则重复上述操作。下面借助源码分析:

    /*** Atomically increments by one the current value.** @return the previous value*/public final int getAndIncrement() {for (;;) {int current = get();    //获取当前值int next = current + 1; //执行加1操作if (compareAndSet(current, next))return current;     //返回当前值}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

可以看出,通过compareAndSet方法,保证原子操作。

    public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}
  • 1
  • 2
  • 3

调用Unsafe类的compareAndSwapInt方法。Unsafe类中方法为native方法,具体未看,原理就是利用CAS。

java有8个基本类型,而这里只有3个,那么其他5个如果也想原子操作呢?其实可以参考AtomicBoolean的实现,它先将boolean类型值转换成int。

数组

原子数组类型参见图中绿色框中的3个类。其底层实现逻辑和原子基本类型一致,这里我们看看如何使用数组类型。

static int[] value = new int[]{1,2};static AtomicIntegerArray ai = new AtomicIntegerArray(value);public static void main(String[] args){ai.getAndSet(0, 3);System.out.println(value[0]);System.out.println(ai.get(0));}

思考一下输出,再看结果:

1
3

是不是和你预想的不一样?传递的数组,为什么没有更改原始数组呢?AtomicIntegerArray会复制传递过来的数组,所以,AtomicIntegerArray修改内部数组元素时,不会影响传入的数组。

原子引用类型

3个原子引用类型,参加图中黄色框中的类。

  • AtomicReference:原子引用类型
  • AtomicStampedReference:原子带有版本号的引用类型
  • AtomicMarkableReference:原子带有标记位的引用类型

原子字段类

参见上图未框住的3个类。 
需要注意的是,因为原子字段类为抽象类,每次使用时,通过静态方法newUpdater()创建一个更新器,并且设置需要更新的类和属性。同时,更新类的字段必须用volatile修饰。

参考:《Java并发编程的艺术》

Concurrent——Atomic原子操作类相关推荐

  1. java.util.concurrent.atomic原子操作类包

    2019独角兽企业重金招聘Python工程师标准>>> 这个包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当 ...

  2. 2-2-3-3、Atomic原子操作类详解

    目录 Atomic原子操作类 作用 分类 基本类型 引用类型 数组类型 对象属性原子修改器 原子类型累加器(jdk1.8增加的类) 作用 性能测试 条件>>>>>> ...

  3. 并发编程-concurrent指南-原子操作类-AtomicBoolean

    类AtomicBoolean 可以用原子方式更新的 boolean 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicBoolean 可用 ...

  4. 并发编程-concurrent指南-原子操作类-AtomicInteger

    在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger 可以用原子方式更新的 ...

  5. 【JDK源码】java.util.concurrent.atomic包常用类详解

    java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方 ...

  6. Java原子操作类,你知道多少?

    原子操作类简介 由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案. 实际上,在J.U.C下的atomic包提供了一系列的操作简单,性能高效,并能保证线程安全的类去 更新基 ...

  7. Java高并发编程(九):Java中原子操作类

    Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量的方式. ...

  8. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析

    文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...

  9. Java Review - 并发编程_原子操作类原理剖析

    文章目录 概述 原子变量操作类 主要方法 incrementAndGet .decrementAndGet .getAndIncrement.getAndDecrement boolean compa ...

最新文章

  1. NYOJ 17 单调递增最长公共子序列
  2. AndroidStudio gradle配置
  3. 让架构更简单,QCon上海2016热点前瞻
  4. 解决微服务在docker上部署后无法连接数据库的问题
  5. 华为 HR 内网 5000 字实名控诉:研发兄弟一个月加班 160 小时却被说不努力...
  6. 淘宝客优惠券领取微信小程序前台和后台源码
  7. h5将word转为html,怎么把Word版通知转化成H5版
  8. 打开程序员心理B面,这些黑红话题他们亲自回应丨1024特辑
  9. 雨果奖 与 星云奖 ------美国的两个科幻奖项
  10. 第7-9节项目2-歌手大奖赛计分系列(1)
  11. android跑马灯效果横向,Android 通过自定义View实现纵向跑马灯效果
  12. 行云Talk|开发工具一体化,在线IDE会不会成为一种趋势呢?
  13. 远期外汇交易的交割日
  14. TimX_Ch1与TimX_Ch1N的差异
  15. 何一娜:诺基亚软件开发工程师典型的一天
  16. 设计需求分析方法与过程
  17. 马宁伟-20年工作经验谈-3-十年磨一剑
  18. 从零开始的树莓派生活(树莓派4B的组装与系统安装)
  19. 页面自动弹出加qq对话框
  20. MySQL安装以及MySQL图像化工具Sqlyog的安装注册

热门文章

  1. Python基础语法学习(字符串)
  2. 3_9 VisitorMode 访问者模式
  3. 聊聊 Service 命名与设计
  4. 一个95分位延迟要求5ms的场景,如何做性能优化
  5. 构建DRM系统的重要基石——EME、CDM、AES、CENC和密钥
  6. 李超:WebRTC传输与服务质量
  7. LiveVideoStack线上交流分享 (十) —— 开源声码器WORLD在语音合成中的应用
  8. 王立众:学习多媒体开发从编解码开始
  9. U盘启动盘恢复原来的大小
  10. Node.js Electron的扩展模块