Atomic原子类介绍

1:类介绍

  在jdk里面提供的原子操作类有4中类型分别是针对原子更新基本类型如Integer,Boolean,Long类型,原子更新数组如AtomicIntegerArray,AtomicLongArray和AtomicReferenceArray对应的是整形数组,长整型数据以及引用数组,还有原子更新引用和原子更新属性。

1.1:原子更新基本类型

  以AtomicInteget为例子我们分析其内部的方法。

  1. int addAndGet(int delta),以原子方式,将输入数值和实例的数值即AtomicInteger的value相加,并返回。
  2. boolean compareAndSet(int expect,int update)如果输入值等于预期值则以原子方式将该值设置为输入值。

  我们打开addAndGet的源码,探究是如何保证能以原子操作将数值相加的尼?

    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

  搜先通过获取volatile的变量,然后通过CAS算法不断地比较,如果变量没有变化,则进行相加即可,并返回true以跳出循环。如果变量发生变化,则compareAndSwapInt修改不成功,返回false,则再次进入while循环,不断进行CAS比较,直到能修改成功为止。

  CAS算法为什么是硬件级别算法?这是因为有专门地CMPXCHG指令,这是一条汇编指令,所以CPU一次通过,是原子操作。

  

原文地址:https://www.cnblogs.com/dazhu123/p/12700248.html

时间: 2024-08-04 02:54:09

Atomic原子类介绍的相关文章

JUC 中的 Atomic 原子类总结

1 Atomic 原子类介绍 Atomic 翻译成中文是原子的意思.在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的.在我们这里 Atomic 是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰. 所以,所谓原子类说简单点就是具有原子/原子操作特征的类. 并发包 java.util.concurrent 的原子类都存放在java.util.concurrent.atomic下,如下图所示. 根据操作的数据类型,可以将JUC包中

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

在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicInteger atomicInteger=new AtomicInteger(); for(int i=0;i<10;i++){ Thread t=new Thread(new AtomicTest(atomicInteger)); t.start(); try { t.join(0); } catch (I

并发编程的艺术第七章-13个原子类介绍

java中的13个原子类操作 13个原子类操作主要分为四大类:原子更新基本类型,原子更新数组,原子更新引用,原子更新属性(字段) atomic 的类基本都是unsafe类的包装类 原子更新基本类型包括: atomicBoolean atomicIneger atomicLong 这里注意lazyset方法,Doug Lea大神已经在oracle官网解释了,原文如下 "As probably the last little JSR166 follow-up for Mustang, we adde

Atomic原子类

原子类实现原理:CAS(compare and swap) CAS的原理是拿期望的值和原本的一个值作比较,如果相同则更新成新的值.UnSafe 类的 objectFieldOffset() 方法是一个本地方法,这个方法是用来拿到"原来的值"的内存地址.另外 value 是一个volatile变量,在内存中可见,因此 JVM 可以保证任何时刻任何线程总能拿到该变量的最新值. CAS包含3个参数CAS(V,E,N).V表示要更新的变量, E表示预期值, N表示新值.仅当V值等于E值时, 才

高并发编程-07-JDK提供的原子类操作及原理

1,原子类介绍: 针对数据类型的操作,JDK提供的原子类来方便我们的线程安全控制. 所有的类保存在 java.util.concurrent.atomic 包中 基本数据类型 AtomicInteger 数组类型 AtomicIntegerArray 2,举个使用的例子: 解决之前的 i++ 安全性问题 如何解决? AtomicInteger count = new AtomicInteger(0); count.incrementAndGet();//相当于count++,区别是这里可以保证是

Netty的并发编程实践3:CAS指令和原子类

互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能的额外损耗,因此这种同步被称为阻塞同步,它属于一种悲观的并发策略,我们称之为悲观锁.随着硬件和操作系统指令集的发展和优化,产生了非阻塞同步,被称为乐观锁.简单地说,就是先进行操作,操作完成之后再判断操作是否成功,是否有并发问题,如果有则进行失败补偿,如果没有就算操作成功,这样就从根本上避免了同步锁的弊端. 目前,在Java中应用最广泛的非阻塞同步就是CAS,在IA64.X86指令集中通过cmpxchg指令完成CAS功能,在sparc-TSO中

java核心-多线程(8)- 并发原子类

????使用锁能解决并发时线程安全性,但锁的代价比较大,而且降低性能.有些时候可以使用原子类(juc-atomic包中的原子类).还有一些其他的非加锁式并发处理方式,我写这篇文章来源于Java中有哪些无锁技术来解决并发问题的思考. 1.原子类场景 刚才说了,原子类是在不加锁的情况下,实现并发安全.我们知道锁synchronized/lock能实现并发安全的三点要求:原子性.可见性和有序性.而原子类顾名思义可以保证原则性其他两点不能确定(我是边想边写的,后面我会给出结论). 好吧,写不下去了,还是

Java并发编程-非阻塞同步方式原子类(Atomic)的使用

非阻塞同步 在大多数情况下,我们为了实现线程安全都会使用Synchronized或lock来加锁进行线程的互斥同步,但互斥同步的最主要的问题就是进行线程的阻塞和唤醒所带来的性能问题,因此这种阻塞也称作阻塞同步.从处理问题的方式上说,互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题,无论共享数据是否真的会出现竞争,它都会进行加锁.用户态核心态转换.维护锁的计数器和检查是否有被阻塞的线程需要被唤醒等操作. 随着硬件指令集的发展,我们有了另一个选择:基于冲突检测的乐

Java学习笔记—多线程(原子类,java.util.concurrent.atomic包,转载)

原子类 Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量的方式. 因为变量的类型有很多种,所以在Atomic包里一共提供了13个类,属于4种类型的原子更 新方式,分别是原子更新基本类型.原子更新数组.原子更新引用和原子更新属性(字段). Atomic包里的类基本都是使用Unsafe实现的包装类 java.util.concurrent.atomic中的类