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 Integer.toString(get()); } /** * Returns the value of this {@code AtomicInteger
一、AtomicInteger 因为在阻塞队列中LinkedBlockingQueue中对容量的维护使用了Atomic类,所以需要对该类学习下,如何使用AtomicInteger来保证线程操作的原子性 实际上源码中可以看出AtomicInteger类中的操作的思想基本上是基于CAS+volatile。 二、AtomicInteger源码 · 结构 public class AtomicInteger extends Number implements java.io.Serializable { AtomicInteger继承了Number类,来实现数字类型的转行操作。 另外AtomicInteger、AtomicLong、AtomicBoolean等的思想也与AtomicInteger类似,因此不具体展开分析。 · 为什么CAS无法解决ABA问题?
精美礼品等你拿!
摘要: AtomicInteger 是怎么做到线程安全的 AtomicInteger 是怎么实现自增的 TOP 带着问题看源码 AtomicInteger 是怎么做到线程安全的 AtomicInteger 基本介绍 AtomicInteger 扩展了 Number,适用于基于数字的处理,并提供了如原子递增等,适合一些计数场景 private static final Unsafe unsafe = Unsafe.getUnsafe final long valueOffset; static { try { valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField 获取 public final int decrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, -1) - 1; } AtomicInteger
AtomicInteger 原子整数 可以原子更新的int值。 用于原子递增计数器等应用程序中,不能用作java.lang.Integer的替换。 扩展了Number。 # 1.继承关系: public class AtomicInteger extends Number implements java.io.Serializable 的偏移量 static { try { valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField private volatile int value; # 3.方法: // 构造 public AtomicInteger(int initialValue) { value = initialValue; } public AtomicInteger() { } public final int get() { return
AtomicInteger的实现原理 AtomicInteger采用基于CAS进行数据的原子性操作的Unsafe工具类,Unsafe类通过在对象实例化的时候记录数据的地址,并通过比较获取的原有数据与新获取数据是否一致来确定数据是否被其他线程修改 而对于数据的可见性,AtomicInteger采用volatile关键字进行修饰,使得线程对数据的操作均作用于主存,从而保证数据在多线程之间的可见性。AtomicInteger的初始化如下所示。 valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField("value") private volatile int value; AtomicInteger提供的主要接口 AtomicInteger提供基本的数据操作,对于复杂的数据操作,其提供了lambda 表达式进行支持 以下是AtomicInteger提供的主要接口。
原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的. 前言 一个可以自动更新的int值。 AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。 继承关系 ? AtomicInteger 的初衷就是在不使用锁的前提下,实现原子的读-改-写操作,这是通过 Unsafe 类提供的 CAS 操作实现的,CAS 操作有底层 CPU 直接支持。 构造方法 AtomicInteger 提供两个构造函数 用给定值初始化 AtomicInteger ? 无参构造,初始值为 0 ? 注意,该类所有方法都被 final 修饰,子类无法重写! counter = new AtomicInteger(); int oldV = counter.get(); counter.set(10); 但该实现是错的,因为 counter.get() 与
原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的. 前言 一个可以自动更新的int值。 AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。 字段,而 value 有 volatile 修饰. valueOffset 在静态代码块中完成初始化: [5088755_1583756733927_20200309190526874.png] AtomicInteger 构造方法 AtomicInteger 提供两个构造函数 用给定值初始化 AtomicInteger [5088755_1583756733906_20200309190902563.png] 无参构造, counter = new AtomicInteger(); int oldV = counter.get(); counter.set(10); 但该实现是错的,因为 counter.get() 与
无锁类之AtomicInteger AtomicInteger 概述 public class AtomicInteger extends Number implements Serializable AtomicInteger的类方法如下所示: ? ("value")是拿到atomicInteger的value字段的field对象 * valueoffset是拿到value的相对于AtomicInteger对象的地址偏移量 * { value = initialValue; } /** * 創建一個初始值為0的新AtomicInteger实例。 即value=0; */ public AtomicInteger() { } /** * 獲取當前值。
package cn.qbz.thread; import java.util.concurrent.atomic.AtomicInteger; public class AtomicTest { public static void main(String[] args) { AtomicInteger count = new AtomicInteger(0); integer; ThreadTest1(AtomicInteger integer) { this.integer = integer; } public package cn.qbz.thread; import java.util.concurrent.atomic.AtomicInteger; public class AtomicTest { public static void main(String[] args) { final AtomicInteger count = new AtomicInteger
this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; } 为什么AtomicInteger
AtomicInteger 原子更新int类型。 AtomicLong 原子更新long类型。 AtomicReference 原子更新引用类型,通过泛型指定要操作的类。 AtomicInteger使用 package com.example.atomic.atomicinteger.demo; import java.util.concurrent.atomic.AtomicInteger 原理 AtomicInteger声明 public class AtomicInteger extends Number implements java.io.Serializable Unsafe类的使用 value; AtomicInteger构造器 /** * Creates a new AtomicInteger with the given initial value {@code 0}. */ public AtomicInteger() { } AtomicInteger自增 /** * Atomically increments
java有NativeMemoryTracking帮助我们查看jvm带来的内存分配问题,这个只能看jvm带来的,如果是jni的调用申请的内存,那这个工具是没有用...
下面我们看一下具有原子操作的类AtomicInteger、AtomicBoolean、AtomicLong。这三个类的的方法使用都是一样的,我们重点看一下AtomicInteger类的使用。 get()的作用是获取当前AtomicInteger类中的值。然后将获取的AtomicInteger类中的值执行加1运算。 最重要的就是这个compareAndSet方法,我们知道这个方法的作用是将AtomicInteger类中的值与预期值做比较,如果相等,那就把AtomicInteger类中的值设置为方法参数的值,并且这个方法也是原子操作 说明get()方法获取的值不是最新的了,也就是说有其它线程已经对AtomicInteger类中的值与做了修改了,那么方法就会一直执行循环,然后继续判断,一直到compareAndSet方法返回ture时为止
但是我并没有展开讲它的详细用法,因为内容多,所以这一章节就来学习一下原子操作类——AtomicInteger AtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于 1、AtomicInteger 有什么用? 用了AtomicInteger类后会变成什么样子? 我们试一下用AtomicInteger 来修饰一下这个count变量。 类来初始化一个int值 public static AtomicInteger count = new AtomicInteger(0); public static void increase 上面例子用到的是AtomicInteger,还有其他场景的数据要求也可以使用合适的原子类。
3 解决 AtomicInteger出现解决了上面的问题,使用它来执行统计: static AtomicInteger at = new AtomicInteger(0); public static InterruptedException e) { e.printStackTrace(); } System.out.println("count = " + at.get()); } AtomicInteger 4 总结 AtomicInteger能够实现整型数据的原子操作,在多线程并发的环境下能保证数据安全,而且内部使用乐观锁实现,比使用锁机制的并发性能高; volatile保证了一个线程修改数据时,其它线程也能看到数据的修改 CAS操作保证了数据修改的安全性 5 线程统计失败个数 多个线程执行一段逻辑,统计有多少个线程失败了 ConcurrentMap<Integer, AtomicInteger> jobTimeoutCountMap timeoutCount = jobTimeoutCountMap.putIfAbsent(22, new AtomicInteger(1)); if
Java原子类实现了线程安全的操作,比如AtomicInteger实现了对int值的安全的加减等. 所以我们学习主要分为两部分,首先学习为什么可以实现线程安全? 这个我们以AtomicInteger为例,其中的incrementAndGet()方法实现方式为: //API public final int incrementAndGet() { AtomicInteger的常用API incrementAndGet: 自增一且返回新值. getAndIncrement: 获取当前值之后将其自增. decrementAndGet: 自减一之后返回新值 和AtomicInteger并没有什么不同,只是对传入的数组下标进行了一下计算,来实现对数组的某个index上的值的原子更改. 完.好水啊…以为原子类要看很久呢.
(3)AtomicInteger是怎么实现原子操作的? (4)AtomicInteger是有什么缺点? 总结 (1)AtomicInteger中维护了一个使用volatile修饰的变量value,保证可见性; (2)AtomicInteger中的主要方法最终几乎都会调用到Unsafe的compareAndSwapInt 彩蛋 (1)为什么需要AtomicInteger? public class AtomicIntegerTest { private static AtomicInteger count = new AtomicInteger(0); public (2)说了那么多,你知道AtomicInteger有什么缺点吗?
五、以上规则对其它对象锁同样适用. 3:AtomicInteger 使用AtomicInteger,即使不用同步块synchronized,最后的结果也是1000,可用看出AtomicInteger的作用
java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger 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
这个问题非常简单,哪怕是Java的初学者都能回答上来,使用AtomicXXX,比如有一个int类型的自加,那么你可以使用AtomicInteger 代替int类型进行自加。 AtomicInteger atomicInteger = new AtomicInteger(); atomicInteger.addAndGet(1); 如上面的代码所示,使用addAndGet 我们首先来看看AtomicInteger类: public class AtomicInteger extends Number implements java.io.Serializable { 成员变量只有一个int value,似乎好像并没有多出内存,但是我们的AtomicInteger是一个对象,一个对象的正确计算应该是 对象头 + 数据大小,在64位机器上AtomicInteger对象占用内存如下 由于我们的AtomicInteger是一个对象,还需要被引用,那么真实的占用为: 关闭指针压缩:24 + 8 = 32 开启指针压缩: 16 + 4 = 20 而fieldUpdater是staic final
扫码关注腾讯云开发者
领取腾讯云代金券