Java Concurrency - AtomicIntegerArray Sınıfı
Bir java.util.concurrent.atomic.AtomicIntegerArray sınıfı, atomik olarak okunabilen ve yazılabilen temel alınan int dizisi üzerinde işlemler sağlar ve ayrıca gelişmiş atomik işlemleri içerir. AtomicIntegerArray, temel alınan int dizi değişkeni üzerinde atomik işlemleri destekler. Uçucu değişkenler üzerinde okuma ve yazma gibi çalışan alma ve ayarlama yöntemlerine sahiptir. Diğer bir deyişle, bir küme aynı değişken üzerindeki sonraki herhangi bir get ile önceden-olur ilişkisine sahiptir. Atomic CompareAndSet yöntemi de bu bellek tutarlılığı özelliklerine sahiptir.
AtomicIntegerArray Yöntemleri
AtomicIntegerArray sınıfında bulunan önemli yöntemlerin listesi aşağıdadır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public int addAndGet(int i, int delta) Verilen değeri, i dizinindeki öğeye atomik olarak ekler. |
2 | public boolean compareAndSet(int i, int expect, int update) Mevcut değer == beklenen değer ise, i konumundaki öğeyi atomik olarak verilen güncellenmiş değere ayarlar. |
3 | public int decrementAndGet(int i) İ indeksindeki bir element atomik olarak azalır. |
4 | public int get(int i) İ konumundaki mevcut değeri alır. |
5 | public int getAndAdd(int i, int delta) Verilen değeri, i dizinindeki öğeye atomik olarak ekler. |
6 | public int getAndDecrement(int i) İ indeksindeki bir element atomik olarak azalır. |
7 | public int getAndIncrement(int i) İ indeksindeki elementi atomik olarak bir artırır. |
8 | public int getAndSet(int i, int newValue) İ konumundaki öğeyi atomik olarak verilen değere ayarlar ve eski değeri döndürür. |
9 | public int incrementAndGet(int i) İ indeksindeki elementi atomik olarak bir artırır. |
10 | public void lazySet(int i, int newValue) Sonunda i konumundaki öğeyi verilen değere ayarlar. |
11 | public int length() Dizinin uzunluğunu döndürür. |
12 | public void set(int i, int newValue) İ konumundaki öğeyi verilen değere ayarlar. |
13 | public String toString() Dizinin geçerli değerlerinin String temsilini döndürür. |
14 | public boolean weakCompareAndSet(int i, int expect, int update) Mevcut değer == beklenen değer ise, i konumundaki öğeyi atomik olarak verilen güncellenmiş değere ayarlar. |
Misal
Aşağıdaki TestThread programı AtomicIntegerArray değişkeninin thread tabanlı ortamda kullanımını göstermektedir.
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");
}
}
}
}
}
Bu, aşağıdaki sonucu verecektir.
Çıktı
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