ConcurrentProgramming:Atomic 原子类


关键词

  • 方法基于CAS实现+自旋
  • AtomicInteger -> Unsafe的对象 -> CAS实现+自旋

一、Atomic介绍

Atomic 翻译成中⽂是原⼦的意思。在化学上,我们知道原⼦是构成⼀般物质的最⼩单位,在化学反应中是不可分割的。在我们这⾥ Atomic 是指⼀个操作是不可中断的。即使是在多个线程⼀起执⾏的时候,⼀个操作⼀旦开始,就不会被其他线程⼲扰

所以,所谓原⼦类说简单点就是具有原⼦/原⼦操作特征的类。

并发包 java.util.concurrent 的原⼦类都存放在 java.util.concurrent.atomic 下,如下图所示。

案例:

public class MyClass {private int count = 0;public void synchronized increment() {count++;}public void synchronized decrement() {count--;}
}

对于一个整数的加减操作,要保证线程安全,需要加锁,也就是加synchronized关键字。

有了Concurrent包的Atomic相关的类之后,synchronized关键字可以用AtomicInteger代替,其性能更好,对应的代码变为:

public class MyClass {private AtomicInteger count = new AtomicInteger(0);public void add() {count.getAndIncrement();}public long minus() {count.getAndDecrement();}
}

源码:

上图中的U是Unsafe的对象:

AtomicInteger的getAndIncrement() 方法和getAndDecrement() 方法都调用了一个方法:U.getAndAddInt(…) 方法,该方法基于CAS实现

do-while循环直到判断条件返回true为止。该操作称为自旋。


getAndAddInt 方法具有volatile的语义,也就是对所有线程都是同时可见的。

而weakCompareAndSetInt 方法的实现:
调用了compareAndSetInt 方法,该方法的实现:

上图中的方法中,

  • 第一个参数表示要修改哪个对象的属性值;
  • 第二个参数是该对象属性在内存的偏移量;
  • 第三个参数表示期望值;
  • 第四个参数表示要设置为的目标值。

二、分类

基本类型

使⽤原⼦的⽅式更新基本类型

  • AtomicInteger :整形原⼦类
  • AtomicLong :⻓整型原⼦类
  • AtomicBoolean :布尔型原⼦类

数组类型

使⽤原⼦的⽅式更新数组⾥的某个元素

  • AtomicIntegerArray :整形数组原⼦类
  • AtomicLongArray :⻓整形数组原⼦类
  • AtomicReferenceArray :引⽤类型数组原⼦类

引⽤类型

  • AtomicReference :引⽤类型原⼦类
  • AtomicStampedReference :原⼦更新带有版本号的引⽤类型。该类将整数值与引⽤关联起来,可⽤于解决原⼦的更新数据和数据的版本号,可以解决使⽤ CAS 进⾏原⼦更新时可能出现的 ABA 问题。
  • AtomicMarkableReference :原⼦更新带有标记位的引⽤类型

对象的属性修改类型

  • AtomicIntegerFieldUpdater :原⼦更新整形字段的更新器
  • AtomicLongFieldUpdater :原⼦更新⻓整形字段的更新器
  • AtomicReferenceFieldUpdater :原⼦更新引⽤类型字段的更新器

ConcurrentProgramming:Atomic 原子类相关推荐

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

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

  2. Atomic原子类常用方法总结(包含四大类型)

    基本介绍: Atomic指一个操作不可中断,即使在多线程情况下,一个操作一旦开始,就不会被其他线程干扰.如果多线程中仅需要Atomic原子类解决的事情,就不需要synchronized重量级锁了. 原 ...

  3. JUC多线程:Atomic原子类与CAS原理

    一.Atomic 原子类的原理: Atomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全.而 CAS 算法的具体实现方 ...

  4. atomic原子类实现机制_深入了解Java atomic原子类的使用方法和原理

    在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicIntege ...

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

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

  6. (转)Java atomic原子类的使用方法和原理(一)

    在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicIntege ...

  7. Atomic原子类和Unsafe魔法类 详解

    文章目录 1. Atomic原子类 1.1 Atomic原子类的作用 1.2 原子更新基本类型类 1.3 原子更新数组类 1.4 原子更新引用类型 1.5 原子更新字段类 2. Unsafe魔法类 2 ...

  8. Atomic原子类及原理

    目录 1 前言 2 unsafe类对Atomic原子类的支持 3 AtomicInteger的内部实现 3.1 准备 3.2 读 3.3 写 4 CAS机制 4.1 基本操作数 4.2 例子 4.3 ...

  9. Atomic 原子类

    1 Atomic 原子类介绍 Atomic 翻译成中文是原子的意思.在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的.在我们这里 Atomic 是指一个操作是不可中断的.即使是 ...

最新文章

  1. 『中级篇』docker容器安装wordpress(37)
  2. 出一个简单的Spring框架入门教程
  3. 邮宝打印面单尺寸调整_如何打印身份证的实际尺寸?怎样用照片打印身份证复印件...
  4. github编程语言排名_这是每种主要编程语言的Hello World应用示例-全部在一个GitHub存储库中
  5. WIN7中文专业版安装英文语言包的方法
  6. 智能门锁电路图_智能门锁工作原理分析及智能门锁基本工作流程技术原理介绍...
  7. win10下虚拟机VMware极简安装PhoenixOS
  8. 计算机导论知识点总结(下)
  9. SQL Story(十)————游标的应该与不应该 (转)
  10. 用药安全,从娃娃抓起
  11. 怎样查找计算机死机日志,死机和日志错误
  12. 七段数码管显示原理研究
  13. 亚马逊显示在售商品为0怎么办?亚马逊新品货还没到就在售了
  14. 【2020年高被引学者】 田奇 华为
  15. Pycharm的python interpreter选择
  16. 嵌入式100题(81):波特率是什么,为什么双方波特率要相同,高低波特率有什么区别;...
  17. SpringBoot常见的经典面试题
  18. c++实现贪心法构造最大整数问题
  19. 金融粉去哪里引流?哪个平台做金融引流好?贴吧精准引流金融粉技巧
  20. MATLAB读写.wav和.raw音频文件

热门文章

  1. 看看30万码农怎么评论:培训出来的程序员真的很渣吗?
  2. web api 开发记录
  3. Shell脚本里调用Python程序
  4. (六)企业部分之jdk
  5. Guava学习笔记:EventBus(转)
  6. macosx下apache的默认用户为daemon
  7. Wireshark数据包分析之数据包信息解读
  8. python笔记-标准库unittest
  9. “针对即席工作负荷进行优化”如何影响你的计划缓存
  10. python 2.7.10 找不到 libmysqlclient.18.dylib 解决方案