Kelas AtomicReferenceArray
Kelas java.util.concurrent.atomic.AtomicReferenceArray menyediakan operasi pada larik referensi yang mendasari yang dapat dibaca dan ditulis secara atomik, dan juga berisi operasi atom tingkat lanjut. AtomicReferenceArray mendukung operasi atom pada variabel array referensi yang mendasarinya. Ini telah mendapatkan dan menetapkan metode yang berfungsi seperti membaca dan menulis pada variabel volatil. Artinya, himpunan memiliki hubungan terjadi-sebelum dengan get berikutnya pada variabel yang sama. Metode atomic CompareAndSet juga memiliki fitur konsistensi memori ini.
Metode AtomicReferenceArray
Berikut adalah daftar metode penting yang tersedia di kelas AtomicReferenceArray.
Sr.No. | Metode & Deskripsi |
---|---|
1 | public boolean compareAndSet(int i, E expect, E update) Secara atomis menyetel elemen di posisi i ke nilai yang diperbarui jika nilai saat ini == nilai yang diharapkan. |
2 | public E get(int i) Mendapat nilai saat ini pada posisi i. |
3 | public E getAndSet(int i, E newValue) Secara atomis menyetel elemen di posisi i ke nilai yang diberikan dan mengembalikan nilai lama. |
4 | public void lazySet(int i, E newValue) Akhirnya mengatur elemen di posisi i ke nilai yang diberikan. |
5 | public int length() Mengembalikan panjang larik. |
6 | public void set(int i, E newValue) Setel elemen di posisi i ke nilai yang diberikan. |
7 | public String toString() Mengembalikan representasi String dari nilai-nilai array saat ini. |
8 | public boolean weakCompareAndSet(int i, E expect, E update) Secara atomis menyetel elemen di posisi i ke nilai yang diperbarui jika nilai saat ini == nilai yang diharapkan. |
Contoh
Program TestThread berikut menunjukkan penggunaan variabel AtomicReferenceArray di lingkungan berbasis thread.
import java.util.concurrent.atomic.AtomicReferenceArray;
public class TestThread {
private static String[] source = new String[10];
private static AtomicReferenceArray<String> atomicReferenceArray
= new AtomicReferenceArray<String>(source);
public static void main(final String[] arguments) throws InterruptedException {
for (int i = 0; i<atomicReferenceArray.length(); i++) {
atomicReferenceArray.set(i, "item-2");
}
Thread t1 = new Thread(new Increment());
Thread t2 = new Thread(new Compare());
t1.start();
t2.start();
t1.join();
t2.join();
}
static class Increment implements Runnable {
public void run() {
for(int i = 0; i<atomicReferenceArray.length(); i++) {
String add = atomicReferenceArray.getAndSet(i,"item-"+ (i+1));
System.out.println("Thread " + Thread.currentThread().getId()
+ ", index " +i + ", value: "+ add);
}
}
}
static class Compare implements Runnable {
public void run() {
for(int i = 0; i<atomicReferenceArray.length(); i++) {
System.out.println("Thread " + Thread.currentThread().getId()
+ ", index " +i + ", value: "+ atomicReferenceArray.get(i));
boolean swapped = atomicReferenceArray.compareAndSet(i, "item-2", "updated-item-2");
System.out.println("Item swapped: " + swapped);
if(swapped) {
System.out.println("Thread " + Thread.currentThread().getId()
+ ", index " +i + ", updated-item-2");
}
}
}
}
}
Ini akan menghasilkan hasil sebagai berikut.
Keluaran
Thread 9, index 0, value: item-2
Thread 10, index 0, value: item-1
Item swapped: false
Thread 10, index 1, value: item-2
Item swapped: true
Thread 9, index 1, value: updated-item-2
Thread 10, index 1, updated-item-2
Thread 10, index 2, value: item-3
Item swapped: false
Thread 10, index 3, value: item-2
Item swapped: true
Thread 10, index 3, updated-item-2
Thread 10, index 4, value: item-2
Item swapped: true
Thread 10, index 4, updated-item-2
Thread 10, index 5, value: item-2
Item swapped: true
Thread 10, index 5, updated-item-2
Thread 10, index 6, value: item-2
Thread 9, index 2, value: item-2
Item swapped: true
Thread 9, index 3, value: updated-item-2
Thread 10, index 6, updated-item-2
Thread 10, index 7, value: item-2
Thread 9, index 4, value: updated-item-2
Item swapped: true
Thread 9, index 5, value: updated-item-2
Thread 10, index 7, updated-item-2
Thread 9, index 6, value: updated-item-2
Thread 10, index 8, value: item-2
Thread 9, index 7, value: updated-item-2
Item swapped: true
Thread 9, index 8, value: updated-item-2
Thread 10, index 8, updated-item-2
Thread 9, index 9, value: item-2
Thread 10, index 9, value: item-10
Item swapped: false