Java多线程系列---“JUC原子类”04之 AtomicLongArray原子类
Posted Hermioner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程系列---“JUC原子类”04之 AtomicLongArray原子类相关的知识,希望对你有一定的参考价值。
转自:https://www.cnblogs.com/skywang12345/p/3514604.html(含部分修改)
概要
AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似。本章以AtomicLongArray对数组类型的原子类进行介绍。内容包括:
- AtomicLongArray介绍和函数列表
- AtomicLongArray源码分析(基于JDK1.7.0_40)
- AtomicLongArray示例
AtomicLongArray介绍和函数列表
AtomicLong是作用是对长整形进行原子操作。而AtomicLongArray的作用则是对"长整形数组"进行原子操作。
AtomicLongArray函数列表
// 创建给定长度的新 AtomicLongArray。 AtomicLongArray(int length) // 创建与给定数组具有相同长度的新 AtomicLongArray,并从给定数组复制其所有元素。 AtomicLongArray(long[] array) // 以原子方式将给定值添加到索引 i 的元素。 long addAndGet(int i, long delta) // 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 boolean compareAndSet(int i, long expect, long update) // 以原子方式将索引 i 的元素减1。 long decrementAndGet(int i) // 获取位置 i 的当前值。 long get(int i) // 以原子方式将给定值与索引 i 的元素相加。 long getAndAdd(int i, long delta) // 以原子方式将索引 i 的元素减 1。 long getAndDecrement(int i) // 以原子方式将索引 i 的元素加 1。 long getAndIncrement(int i) // 以原子方式将位置 i 的元素设置为给定值,并返回旧值。 long getAndSet(int i, long newValue) // 以原子方式将索引 i 的元素加1。 long incrementAndGet(int i) // 最终将位置 i 的元素设置为给定值。 void lazySet(int i, long newValue) // 返回该数组的长度。 int length() // 将位置 i 的元素设置为给定值。 void set(int i, long newValue) // 返回数组当前值的字符串表示形式。 String toString() // 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 boolean weakCompareAndSet(int i, long expect, long update)
说明:以incrementAndGet源码为例,最终还是调用的Unsafe类中的compareAndSwapLong方法。
举例:
1 package com.test.a; 2 3 // LongArrayTest.java的源码 4 import java.util.concurrent.atomic.AtomicLongArray; 5 6 public class LongArrayTest { 7 8 public static void main(String[] args) { 9 10 // 新建AtomicLongArray对象 11 long[] arrLong = new long[] { 10, 20, 30, 40, 50 }; 12 AtomicLongArray ala = new AtomicLongArray(arrLong); 13 14 ala.set(0, 100); 15 for (int i = 0, len = ala.length(); i < len; i++) 16 System.out.printf("get(%d) : %s\\n", i, ala.get(i)); 17 18 System.out.printf("%20s : %s\\n", "getAndDecrement(0)", ala.getAndDecrement(0)); 19 System.out.printf("%20s : %s\\n", "decrementAndGet(1)", ala.decrementAndGet(1)); 20 System.out.printf("%20s : %s\\n", "getAndIncrement(2)", ala.getAndIncrement(2)); 21 System.out.printf("%20s : %s\\n", "incrementAndGet(3)", ala.incrementAndGet(3)); 22 23 System.out.printf("%20s : %s\\n", "addAndGet(100)", ala.addAndGet(0, 100)); 24 System.out.printf("%20s : %s\\n", "getAndAdd(100)", ala.getAndAdd(1, 100)); 25 26 System.out.printf("%20s : %s\\n", "compareAndSet()", ala.compareAndSet(2, 31, 1000)); 27 System.out.printf("%20s : %s\\n", "get(2)", ala.get(2)); 28 } 29 }
1 get(0) : 100 2 get(1) : 20 3 get(2) : 30 4 get(3) : 40 5 get(4) : 50 6 getAndDecrement(0) : 100 7 decrementAndGet(1) : 19 8 getAndIncrement(2) : 30 9 incrementAndGet(3) : 41 10 addAndGet(100) : 199 11 getAndAdd(100) : 19 12 compareAndSet() : true 13 get(2) : 1000
以上是关于Java多线程系列---“JUC原子类”04之 AtomicLongArray原子类的主要内容,如果未能解决你的问题,请参考以下文章
Java多线程系列---“JUC原子类”06之 AtomicLongFieldUpdater原子类
Java多线程系列---“JUC原子类”05之 AtomicReference原子类
Java多线程系列---“JUC原子类”01之 原子类的实现(CAS算法)