Java Concurrency - Kelas AtomicIntegerArray
Kelas java.util.concurrent.atomic.AtomicIntegerArray menyediakan operasi pada larik int yang mendasari yang dapat dibaca dan ditulis secara atomik, dan juga berisi operasi atom tingkat lanjut. AtomicIntegerArray mendukung operasi atom pada variabel int array yang mendasari. Itu 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 AtomicIntegerArray
Berikut adalah daftar metode penting yang tersedia di kelas AtomicIntegerArray.
Sr.No. | Metode & Deskripsi |
---|---|
1 | public int addAndGet(int i, int delta) Secara atomis menambahkan nilai yang diberikan ke elemen pada indeks i. |
2 | public boolean compareAndSet(int i, int expect, int update) Secara atomis menyetel elemen di posisi i ke nilai yang diperbarui jika nilai saat ini == nilai yang diharapkan. |
3 | public int decrementAndGet(int i) Secara atomik mengurangi satu elemen pada indeks i. |
4 | public int get(int i) Mendapat nilai saat ini pada posisi i. |
5 | public int getAndAdd(int i, int delta) Secara atomis menambahkan nilai yang diberikan ke elemen pada indeks i. |
6 | public int getAndDecrement(int i) Secara atomik mengurangi satu elemen pada indeks i. |
7 | public int getAndIncrement(int i) Secara atomis bertambah satu elemen pada indeks i. |
8 | public int getAndSet(int i, int newValue) Secara atomis menyetel elemen di posisi i ke nilai yang diberikan dan mengembalikan nilai lama. |
9 | public int incrementAndGet(int i) Secara atomis bertambah satu elemen pada indeks i. |
10 | public void lazySet(int i, int newValue) Akhirnya menetapkan elemen di posisi i ke nilai yang diberikan. |
11 | public int length() Mengembalikan panjang larik. |
12 | public void set(int i, int newValue) Setel elemen di posisi i ke nilai yang diberikan. |
13 | public String toString() Mengembalikan representasi String dari nilai-nilai array saat ini. |
14 | public boolean weakCompareAndSet(int i, int expect, int 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 AtomicIntegerArray di lingkungan berbasis thread.
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");
}
}
}
}
}
Ini akan menghasilkan hasil sebagai berikut.
Keluaran
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