Java併發AtomicIntegerArray類
java.util.concurrent.atomic.AtomicIntegerArray
類提供了可以以原子方式讀取和寫入的底層int
數組的操作,還包含高級原子操作。 AtomicIntegerArray
支持對底層int
數組變量的原子操作。 它具有獲取和設置方法,如在變量上的讀取和寫入。 也就是說,一個集合與同一變量上的任何後續get
相關聯。 原子compareAndSet
方法也具有這些內存一致性功能。
序號
方法
描述
1
public int addAndGet(int i, int delta)
原子地將給定的值添加到索引i
的元素。
2
public boolean compareAndSet(int i, int expect, int update)
如果當前值==
期望值,則將位置i
處的元素原子設置爲給定的更新值。
3
public int decrementAndGet(int i)
索引i
處的元素原子並自減1
。
4
public int get(int i)
獲取位置i
的當前值。
5
public int getAndAdd(int i, int delta)
原子地將給定的值添加到索引i
的元素。
6
public int getAndDecrement(int i)
索引i
處的元素原子並自減1
,並返回舊值。
7
public int getAndIncrement(int i)
將位置i
處的元素原子設置爲給定值,並返回舊值。
8
public int getAndSet(int i, int newValue)
將位置i
處的元素原子設置爲給定值,並返回舊值。
9
public int incrementAndGet(int i)
在索引i
處以原子方式自增元素。
10
public void lazySet(int i, int newValue)
最終將位置i
處的元素設置爲給定值。
11
public int length()
返回數組的長度。
12
public void set(int i, int newValue)
將位置i
處的元素設置爲給定值。
13
public String toString()
返回數組的當前值的String
表示形式。
14
public boolean weakCompareAndSet(int i, int expect, int update)
如果當前值==
期望值,則將位置i
處的元素原子設置爲給定的更新值。
實例
以下TestThread
程序顯示了基於線程的環境中AtomicIntegerArray
變量的使用。
import java.util.concurrent.atomic.AtomicIntegerArray;
public class TestThread {
private static AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(10);
public static void main(final String[] arguments) throws InterruptedException {
for (int i=0; i<atomicIntegerArray.length(); i++) {
atomicIntegerArray.set(i, 1);
}
Thread t1 = new Thread(new Increment());
Thread t2 = new Thread(new Compare());
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Values: ");
for (int i=0; i<atomicIntegerArray.length(); i++) {
System.out.print(atomicIntegerArray.get(i) + " ");
}
}
static class Increment implements Runnable {
public void run() {
for(int i=0; i<atomicIntegerArray.length(); i++) {
int add = atomicIntegerArray.incrementAndGet(i);
System.out.println("Thread " + Thread.currentThread().getId()
+ ", index " +i + ", value: "+ add);
}
}
}
static class Compare implements Runnable {
public void run() {
for(int i=0; i<atomicIntegerArray.length(); i++) {
boolean swapped = atomicIntegerArray.compareAndSet(i, 2, 3);
if(swapped){
System.out.println("Thread " + Thread.currentThread().getId()
+ ", index " +i + ", value: 3");
}
}
}
}
}
這將產生以下結果 -
Thread 10, index 0, value: 2
Thread 10, index 1, value: 2
Thread 10, index 2, value: 2
Thread 11, index 0, value: 3
Thread 10, index 3, value: 2
Thread 11, index 1, value: 3
Thread 11, index 2, value: 3
Thread 10, index 4, value: 2
Thread 11, index 3, value: 3
Thread 10, index 5, value: 2
Thread 10, index 6, value: 2
Thread 11, index 4, value: 3
Thread 10, index 7, value: 2
Thread 11, index 5, value: 3
Thread 10, index 8, value: 2
Thread 11, index 6, value: 3
Thread 10, index 9, value: 2
Thread 11, index 7, value: 3
Thread 11, index 8, value: 3
Thread 11, index 9, value: 3
Values:
3 3 3 3 3 3 3 3 3 3