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 }
View Code
 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
View Code

 

以上是关于Java多线程系列---“JUC原子类”04之 AtomicLongArray原子类的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程系列---“JUC原子类”06之 AtomicLongFieldUpdater原子类

Java多线程系列---“JUC原子类”05之 AtomicReference原子类

Java多线程系列---“JUC原子类”01之 原子类的实现(CAS算法)

java多线程系类:JUC原子类:04之AtomicReference原子类

Java多线程系列--“JUC线程池”01之 线程池架构

java 多线程系列---JUC原子类之AtomicLong原子类