展开

关键词

CAS && AtomicInteger

AtomicInteger package java.util.concurrent.atomic;import java.util.function.IntUnaryOperator;import java.util.function.IntBinaryOperator;import sun.misc.Unsafe; public class AtomicInteger extends Number (int initialValue) { value = initialValue; } ** * Creates a new AtomicInteger with initial value {@code 0}. * public AtomicInteger() { } public final int get() { return value; } ** * Sets to the given value public String toString() { return Integer.toString(get()); } ** * Returns the value of this {@code AtomicInteger

22200

AtomicInteger详解

一、AtomicInteger 因为在阻塞队列中LinkedBlockingQueue中对容量的维护使用了Atomic类,所以需要对该类学习下,如何使用AtomicInteger来保证线程操作的原子性。 实际上源码中可以看出AtomicInteger类中的操作的思想基本上是基于CAS+volatile。 二、AtomicInteger源码· 结构 public class AtomicInteger extends Number implements java.io.Serializable { AtomicInteger · 构造函数 指定初始化的值public AtomicInteger(int initialValue) { value = initialValue;} 未指定public AtomicInteger 另外AtomicInteger、AtomicLong、AtomicBoolean等的思想也与AtomicInteger类似,因此不具体展开分析。· 为什么CAS无法解决ABA问题?

24910
  • 广告
    关闭

    50+款云产品免费体验

    提供包括云服务器,云数据库在内的50+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    009.多线程-AtomicInteger

    java.util.concurrent.atomic.AtomicInteger; public class AtomicTest { public static void main(String[] args) { final AtomicInteger count = new AtomicInteger(0); 分10个线程,每个线程自增2000次 for (int i = 0; i < 10; i++) { new Thread(new Runnable

    18220

    AtomicInteger源码解析

    AtomicInteger的实现原理AtomicInteger采用基于CAS进行数据的原子性操作的Unsafe工具类,Unsafe类通过在对象实例化的时候记录数据的地址,并通过比较获取的原有数据与新获取数据是否一致来确定数据是否被其他线程修改 而对于数据的可见性,AtomicInteger采用volatile关键字进行修饰,使得线程对数据的操作均作用于主存,从而保证数据在多线程之间的可见性。AtomicInteger的初始化如下所示。 private volatile int value;AtomicInteger提供的主要接口 AtomicInteger提供基本的数据操作,对于复杂的数据操作,其提供了lambda 表达式进行支持。 以下是AtomicInteger提供的主要接口。

    13830

    AtomicInteger 源码分析

    摘要: AtomicInteger 是怎么做到线程安全的AtomicInteger 是怎么实现自增的 TOP 带着问题看源码AtomicInteger 是怎么做到线程安全的AtomicInteger 是怎么实现自增的 基本介绍AtomicInteger 扩展了 Number,适用于基于数字的处理,并提供了如原子递增等,适合一些计数场景private static final Unsafe unsafe = Unsafe.getUnsafe 自减 & 获取public final int decrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, -1) - 1;}AtomicInteger

    14220

    AtomicInteger源码分析详解

    一个AtomicInteger用于诸如原子增量计数器的应用程序中,不能用作Integer的替代品 。 但是,这个类确实扩展了Number以允许通过处理基于数字类的工具和实用程序的统一访问。 AtomicInteger的类方法如下所示: ? 的值下面的操作都是围绕value展开 * private volatile int value; **构造方法 * 使用給定的初始值創建新的AtomicInteger。 ; } ** * 創建一個初始值為0的新AtomicInteger实例。 即value=0; * public AtomicInteger() { } ** * 獲取當前值。

    27150

    AtomicInteger之实现简析 原

    this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; }    为什么AtomicInteger中的value有volatile

    33740

    AtomicInteger 核心源码解析

    原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的.前言一个可以自动更新的int值。 AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。继承关系? AtomicInteger 的初衷就是在不使用锁的前提下,实现原子的读-改-写操作,这是通过 Unsafe 类提供的 CAS 操作实现的,CAS 操作有底层 CPU 直接支持。 构造方法AtomicInteger 提供两个构造函数用给定值初始化 AtomicInteger ?无参构造,初始值为 0 ?注意,该类所有方法都被 final 修饰,子类无法重写! (10) 之间可能插入其他线程的 set,所以 oldV 不能保证是 set(10) 执行时的 value 值,当然通过锁将 get 与 set(10) 变成原子操作可以满足需求,但我们使用 AtomicInteger

    17421

    AtomicInteger 核心源码解析

    原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的. 前言 一个可以自动更新的int值。 AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。 进行更新 注意到 unsafe 和 valueOffset 都是 static final 字段,而 value 有 volatile 修饰. valueOffset 在静态代码块中完成初始化: AtomicInteger 构造方法 AtomicInteger 提供两个构造函数 用给定值初始化 AtomicInteger 无参构造,初始值为 0 注意,该类所有方法都被 final 修饰,子类无法重写! (10) 之间可能插入其他线程的 set,所以 oldV 不能保证是 set(10) 执行时的 value 值,当然通过锁将 get 与 set(10) 变成原子操作可以满足需求,但我们使用 AtomicInteger

    16441

    AtomicInteger原子类原理解析

    AtomicInteger原子更新int类型。AtomicLong原子更新long类型。AtomicReference原子更新引用类型,通过泛型指定要操作的类。 count = new AtomicInteger(); 100个线程 for (int i = 0; i < 10; i++) { 每个线程对count累加10次 new Thread(() - 原理AtomicInteger声明public class AtomicInteger extends Number implements java.io.Serializable Unsafe类的使用 属性 private volatile int value; AtomicInteger构造器 ** * Creates a new AtomicInteger with the given initial initialValue; } ** * Creates a new AtomicInteger with initial value {@code 0}. * public AtomicInteger

    10910

    一直使用AtomicInteger?试一试FiledUpdater

    这个问题非常简单,哪怕是Java的初学者都能回答上来,使用AtomicXXX,比如有一个int类型的自加,那么你可以使用AtomicInteger 代替int类型进行自加。 AtomicInteger atomicInteger = new AtomicInteger(); atomicInteger.addAndGet(1);如上面的代码所示,使用addAndGet即可保证多线程中相加

    24320

    AtomicInteger、AtomicBoolean、AtomicLong等原子类的使用

    下面我们看一下具有原子操作的类AtomicInteger、AtomicBoolean、AtomicLong。这三个类的的方法使用都是一样的,我们重点看一下AtomicInteger类的使用。 get()的作用是获取当前AtomicInteger类中的值。然后将获取的AtomicInteger类中的值执行加1运算。 最重要的就是这个compareAndSet方法,我们知道这个方法的作用是将AtomicInteger类中的值与预期值做比较,如果相等,那就把AtomicInteger类中的值设置为方法参数的值,并且这个方法也是原子操作 说明get()方法获取的值不是最新的了,也就是说有其它线程已经对AtomicInteger类中的值与做了修改了,那么方法就会一直执行循环,然后继续判断,一直到compareAndSet方法返回ture时为止

    35430

    Atomicinteger来学习 Java的原子类

    concurrent包一直都是很重要的知识点,因为他是进阶高级工程师必备,而其中的atomic包中的原子类是最为经常使用到的,所以学习一下atomic下的一些类的源码.Java原子类实现了线程安全的操作,比如AtomicInteger 这个我们以AtomicInteger为例,其中的incrementAndGet()方法实现方式为: API public final int incrementAndGet() { return unsafe.getAndAddInt 当且仅当目标值等于给定值的时候才进行写入操作.具体原理可以google一下.可以看到在上面的getAndAddInt方法中,显示获取了当前内存地址的值,然后进行比较交换,如果相同则成功,不相同则轮询.AtomicInteger 出来了get和set外:updateAndGet: 更新值并获取新值.getAndUpdate: 获取旧值之后更新值.注意传入的参数是声明的V.AtomicIntegerArrayint数字的原子类.和AtomicInteger

    20430

    告诉你一个 AtomicInteger 的惊天大秘密!

    它的继承体系很简单,下面我们来看一下它的基本属性和方法AtomicInteger 的基本属性AtomicInteger 的基本属性有三个? AtomicInteger 的构造方法继续往下看,AtomicInteger 的构造方法只有两个,一个是无参数的构造方法,无参数的构造方法默认的 value 初始值是 0 ,带参数的构造方法可以指定初始值 AtomicInteger 中的方法下面我们就来聊一下 AtomicInteger 中的方法。 下面我们构建一个加锁解锁的 CASLockclass CASLock { AtomicInteger atomicInteger = new AtomicInteger(); Thread currentThread 深入 AtomicInteger我们上面探讨了 AtomicInteger 的具体使用,同时我们知道 AtomicInteger 是依靠 volatile 和 CAS 来保证原子性的,那么我们下面就来分析一下为什么

    14720

    死磕 java并发包之AtomicInteger源码分析

    (3)AtomicInteger是怎么实现原子操作的?(4)AtomicInteger是有什么缺点? 简介AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。还记得Unsafe吗? 总结(1)AtomicInteger中维护了一个使用volatile修饰的变量value,保证可见性;(2)AtomicInteger中的主要方法最终几乎都会调用到Unsafe的compareAndSwapInt 彩蛋(1)为什么需要AtomicInteger? (2)说了那么多,你知道AtomicInteger有什么缺点吗?

    25920

    (十七)AtomicInteger原子类的介绍和使用

    原子类的介绍和使用----在第十四章(十四)volatile的用法,为什么不能确保原子性提到 AtomicInteger 可以保证原子性。 1、AtomicInteger 有什么用? 用了AtomicInteger类后会变成什么样子?我们试一下用AtomicInteger 来修饰一下这个count变量。 类来初始化一个int值 public static AtomicInteger count = new AtomicInteger(0); public static void increase() { 上面例子用到的是AtomicInteger,还有其他场景的数据要求也可以使用合适的原子类。

    15740

    诡异了,AtomicInteger 在 Kotlin 里面居然是 Abstract 的?

    此坑真是久长时啊我以为这是在逗我玩呢,毕竟看了下 AtomicInteger 和它的父类 Number,找了半天也没有找到所谓的 toByte 方法啊。 必然是啊,不过这事儿也有点儿奇怪了,毕竟 AtomicInteger 继承的可是 java.lang.Number,Kotlin 和 Java 中的这两个 Number 之间有什么关系么?3. 这样的方法在 AtomicInteger 和 java.lang.Number 当中都没有具体实现,这就导致了前面的情况发生。 而对于我们遇到的问题,从逻辑上讲,AtomicInteger 这个类不应该是 open 的,我们继承它和把它作为一个组件进行组合实际上是没有区别的,对于组合就可以解决的问题,就不应该使用继承。 换句话说,文章开头的代码正确的写法应该是:class CallArbiter{ val atomicState = AtomicInteger(STATE_WAITING) ...}

    20010

    java并发编程JUC第十二篇:AtomicInteger原子整型

    AtomicInteger基础用法通过下文的AtomicInteger构造方法,可以创建一个AtomicInteger对象,该对象的初始值默认为0。 AtomicInteger提供get和set方法,获取底层int整数值,与设置int整数值初始值为0的atomicInteger对象AtomicInteger atomicInteger = new AtomicInteger (); 初始值为200的atomicInteger对象AtomicInteger atomicInteger = new AtomicInteger(200); int currentValue = atomicInteger.get 原子计数器场景把AtomicInteger作为一个计数器使用,AtomicInteger提供了若干方法进行加法、减法的原子操作。 AtomicInteger atomicInteger = new AtomicInteger(100); 当前值100 = 预期值100,所以设置atomicInteger=110 boolean

    11330

    java多线程技术第N篇|AtomicInteger源码赏析

    一,AtomicInteger源码赏析 1,为什么要使用原子类AtomicInteger? 正如开头所陈述的那样,我们为什么要是用AtomicInteger原子类?我们不妨看下下面的一段程序运行的结果吧。 2,不使用原子操作类AtomicInteger,我们有什么可以替代的方案吗? 3,原子类AtomicInteger的源码方法有哪些我们需要关注的? (1)构造函数 构建一个初始值为0的原子类 public AtomicInteger() { } (2)构造函数 构建一个给定初始值数据的构造函数 public AtomicInteger(int initialValue

    17620

    线程安全之原子性Atomic(AtomicInteger|LongAdder|AtomicLong)

    AtomicTest { private static Integer clientTotal=5000; private static Integer threadTotal=200; private static AtomicInteger count=new AtomicInteger(0); public static void main(String args) { ExecutorService executorService =

    12600

    扫码关注云+社区

    领取腾讯云代金券