文章基於jdk1.7,通過學習《Java併發程式設計的藝術》,對Java原子操作的理解
通過原子的方式更新陣列中的某個元素,Atomic包提供了以下3個類。
- AtomicIntegerArray:原子更新整型陣列裡的元素。
- AtomicLongArray :原子更新長整型陣列裡的元素。
- AtomicReferenceArray:原子更新引用型別陣列裡的元素。
AtomicIntegerArray類常用方法如下:
- int addAndGet(int i,int delta):以原子方式將輸入值與陣列中索引 i 的元素相加
- boolean compareAndSet(int i,int expect,int update):如果當前值等於預期值,則以原子方式將陣列位置i的元素設定成update值.
AtomicIntegerArray示例如下:
import java.util.concurrent.atomic.AtomicIntegerArray;
/**
* @author: xbq
* @date: 2018/10/7 10:58
* @description:
*/
public class AtomicIntegerArrayTest {
static int[] value = new int[] {1, 2};
static AtomicIntegerArray array = new AtomicIntegerArray(value);
public static void main(String[] args) {
System.out.println("---------------getAndSet---------------");
// 獲取索引為0的值,並且賦值為3
System.out.println(array.getAndSet(0, 3));
System.out.println(array.get(0));
System.out.println("---------------addAndGet---------------");
// 獲取索引為1的值 並且 加10
System.out.println(array.addAndGet(1, 10));
System.out.println(array.get(1));
System.out.println("-------------compareAndSet-----------------");
// 獲取索引為1的值,和期望的值比較,若相等,就更新為 新值,否則,返回 false
System.out.println(array.compareAndSet(1,12,20));
System.out.println(array.get(1));
System.out.println("-------------getAndIncrement-----------------");
// 獲取索引為1的值,並且加1,返回 原值
System.out.println(array.getAndIncrement(1));
System.out.println(array.get(1));
System.out.println("-------------incrementAndGet-----------------");
// 獲取索引為1的值,並且加1,返回 加1後的值
System.out.println(array.incrementAndGet(1));
System.out.println(array.get(1));
System.out.println("--------------decrementAndGet----------------");
// 獲取索引為1的值,並且減1,返回減1 後的值
System.out.println(array.decrementAndGet(1));
System.out.println(array.get(1));
}
}
複製程式碼
結果如下:
---------------getAndSet---------------
1
3
---------------addAndGet---------------
12
12
-------------compareAndSet-----------------
true
20
-------------getAndIncrement-----------------
20
21
-------------incrementAndGet-----------------
22
22
--------------decrementAndGet----------------
21
21
複製程式碼
值得注意的是,陣列value通過構造方法傳遞進去,然後AtomicIntegerArray會將當前陣列複製一份,所以當AtomicIntegerArray對內部的陣列元素進行修改時,不會影響傳入的陣列。
歡迎關注我的公眾號~ 搜尋公眾號: 翻身碼農把歌唱 或者 掃描下方二維碼: