原子数组
原子数组有 AtomicIntegerArray 、 AtomicLongArray 、 AtomicReferenceArray ,主要是用来对数组中的某个元素进行原子操作。三个类的方法基本类似,这里只介绍一下 AtomicIntegerArray 的方法。
AtomicIntegerArray
两个构造方法,第一个构造方法传入数组长度初始化一个所有值都为 0 的数组,第二个构造方法直接传入一个数组来进行初始化。
1 2 |
public AtomicIntegerArray( int length) public AtomicIntegerArray( int [] array) |
先获取数组中索引为 i 的值,然后对它进行加 1
1 |
public final int getAndIncrement( int i) |
先获取数组中索引为 i 的值,然后对它进行减 1
1 |
public final int getAndDecrement( int i) |
先对数组中索引为 i 的值进行加 1 ,然后获取新值
1 |
public final int incrementAndGet( int i) |
先对数组中索引为i的值进行减1,然后获取新值
1 |
public final int decrementAndGet( int i) |
先对数组中索引为 i 的值进行加 delta ,然后获取新值
1 |
public final int addAndGet( int i, int delta) |
先获取数组中索引为i的值,然后对它进行加delta
1 |
public final int getAndAdd( int i, int delta) |
先获取数组中索引为 i 的值,然后把它设置为 newValue
1 |
public final int getAndSet( int i, int newValue) |
先获取数组中索引为 i 的值,然后执行指定的操作对其进行更新
1 |
public final int getAndUpdate( int i, IntUnaryOperator updateFunction) |
先执行指定的操作对其进行更新,然后获取新值
1 |
public final int updateAndGet( int i, IntUnaryOperator updateFunction) |
原子更新器
原子更新器有 AtomicIntegerFieldUpdater 、 AtomicLongFieldUpdater 、 AtomicReferenceFieldUpdater ,它们的作用是对某个对象的某个属性进行原子操作,同样三个类的操作基本相同,只是属性的类型不同而已,这里以 AtomicIntegerFieldUpdater 为例介绍基本方法。
AtomicIntegerFieldUpdater
类中提供了一个静态方法来创建对象,两个参数分别是 tclass :要操作的类, fieldName :要操作的类的属性名
1 2 |
public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName) |
先获取对象 obj 的属性 fieldName 的值,然后对其进行自增 1 操作
1 |
public int getAndIncrement(T obj) |
先获取对象 obj 的属性 fieldName 的值,然后对其进行自减 1 操作
1 |
public int getAndDecrement(T obj) |
先把对象 obj 的属性 fieldName 的值进行自增 1 ,然后获取新值
1 |
public int incrementAndGet(T obj) |
先把对象 obj 的属性 fieldName 的值进行自减 1 ,然后获取新值
1 |
public int decrementAndGet(T obj) |
先获取对象 obj 的属性 fieldName 的值,然后对其加 delta
1 |
public int getAndAdd(T obj, int delta) |
先把对象 obj 的属性 fieldName 的值加 delta ,然后获取新值
1 |
public int addAndGet(T obj, int delta) |
先获取对象 obj 的属性 fieldName 的值,然后把它的值设为 newValue
1 |
public int getAndSet(T obj, int newValue) |
先获取对象 obj 的属性 fieldName 的值,然后执行指定的操作把更新它的值
1 |
public final int getAndUpdate(T obj, IntUnaryOperator updateFunction) |
原子累加器
原子累加器 LongAdder 是 jdk1.8 新增的一个类,它的作用和 AtomicInteger 、 AtomicLong 类似,但是在多线程情况下它的性能要高很多,原因是 LongAdder 维护了一个 Cell 数组,累加操作时每个线程对其中一个数据进行操作,最后再把结果进行汇总,提高了并发性。
LongAdder
无参构造方法什么也没有做,默认累加器的结果就是 0
1 |
public LongAdder() |
sum 方法就是对 Cell 数组中各单元的值进行求和,然后返回当前累加器的值
1 |
public long sum() |
累加器自增 1
1 |
public void increment() |
累加器自减 1
1 |
public void decrement() |
累加器加 x
1 |
public void add( long x) |
累加器的值重置为 0
1 |
public void reset() |
先获取累加器的值,然后再重置为 0
1 |
public long sumThenReset() |
以上就是详解Java并发编程之原子类的详细内容,更多关于Java并发原子类的资料请关注其它相关文章!
原文链接:https://juejin.cn/post/7225569023828328503