Java Eşzamanlılığı - AtomicLongArray Sınıfı
Bir java.util.concurrent.atomic.AtomicLongArray sınıfı, atomik olarak okunabilen ve yazılabilen temel uzun dizi üzerinde işlemler sağlar ve ayrıca gelişmiş atomik işlemleri içerir. AtomicLongArray, temeldeki uzun 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.
AtomicLongArray Yöntemleri
AtomicLongArray sınıfında bulunan önemli yöntemlerin listesi aşağıdadır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public long addAndGet(int i, long delta) Verilen değeri, i dizinindeki öğeye atomik olarak ekler. |
2 | public boolean compareAndSet(int i, long expect, long update) Mevcut değer == beklenen değer ise, i konumundaki öğeyi atomik olarak verilen güncellenmiş değere ayarlar. |
3 | public long decrementAndGet(int i) İ indeksindeki bir element atomik olarak azalır. |
4 | public long get(int i) İ konumundaki mevcut değeri alır. |
5 | public long getAndAdd(int i, long delta) Verilen değeri, i dizinindeki öğeye atomik olarak ekler. |
6 | public long getAndDecrement(int i) İ indeksindeki bir element atomik olarak azalır. |
7 | public long getAndIncrement(int i) İ indeksindeki elementi atomik olarak bir artırır. |
8 | public long getAndSet(int i, long newValue) İ konumundaki öğeyi atomik olarak verilen değere ayarlar ve eski değeri döndürür. |
9 | public long incrementAndGet(int i) İ indeksindeki elementi atomik olarak bir artırır. |
10 | public void lazySet(int i, long 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, long 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, long expect, long 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.AtomicLongArray;
public class TestThread {
private static AtomicLongArray atomicLongArray = new AtomicLongArray(10);
public static void main(final String[] arguments) throws InterruptedException {
for (int i = 0; i<atomicLongArray.length(); i++) {
atomicLongArray.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<atomicLongArray.length(); i++) {
System.out.print(atomicLongArray.get(i) + " ");
}
}
static class Increment implements Runnable {
public void run() {
for(int i = 0; i<atomicLongArray.length(); i++) {
long add = atomicLongArray.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<atomicLongArray.length(); i++) {
boolean swapped = atomicLongArray.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 9, index 0, value: 2
Thread 10, index 0, value: 3
Thread 9, index 1, value: 2
Thread 9, index 2, value: 2
Thread 9, index 3, value: 2
Thread 9, index 4, value: 2
Thread 10, index 1, value: 3
Thread 9, index 5, value: 2
Thread 10, index 2, value: 3
Thread 9, index 6, value: 2
Thread 10, index 3, value: 3
Thread 9, index 7, value: 2
Thread 10, index 4, value: 3
Thread 9, index 8, value: 2
Thread 9, index 9, value: 2
Thread 10, index 5, value: 3
Thread 10, index 6, value: 3
Thread 10, index 7, value: 3
Thread 10, index 8, value: 3
Thread 10, index 9, value: 3
Values:
3 3 3 3 3 3 3 3 3 3