Concorrenza Java - AtomicIntegerArray Class
Una classe java.util.concurrent.atomic.AtomicIntegerArray fornisce operazioni sull'array int sottostante che possono essere lette e scritte in modo atomico e contiene anche operazioni atomiche avanzate. AtomicIntegerArray supporta operazioni atomiche sulla variabile matrice int sottostante. Ha metodi get e set che funzionano come letture e scritture su variabili volatili. Cioè, un insieme ha una relazione accade prima con qualsiasi successivo get sulla stessa variabile. Anche il metodo compareAndSet atomico ha queste caratteristiche di coerenza della memoria.
Metodi AtomicIntegerArray
Di seguito è riportato l'elenco dei metodi importanti disponibili nella classe AtomicIntegerArray.
Sr.No. | Metodo e descrizione |
---|---|
1 | public int addAndGet(int i, int delta) Atomicamente aggiunge il valore dato all'elemento all'indice i. |
2 | public boolean compareAndSet(int i, int expect, int update) Atomicamente imposta l'elemento nella posizione i al valore aggiornato dato se il valore corrente == il valore atteso. |
3 | public int decrementAndGet(int i) Atomicamente decrementa di uno l'elemento all'indice i. |
4 | public int get(int i) Ottiene il valore corrente nella posizione i. |
5 | public int getAndAdd(int i, int delta) Atomicamente aggiunge il valore dato all'elemento all'indice i. |
6 | public int getAndDecrement(int i) Atomicamente decrementa di uno l'elemento all'indice i. |
7 | public int getAndIncrement(int i) Atomicamente incrementa di uno l'elemento all'indice i. |
8 | public int getAndSet(int i, int newValue) Atomicamente imposta l'elemento nella posizione i al valore dato e restituisce il vecchio valore. |
9 | public int incrementAndGet(int i) Atomicamente incrementa di uno l'elemento all'indice i. |
10 | public void lazySet(int i, int newValue) Alla fine imposta l'elemento in posizione i al valore dato. |
11 | public int length() Restituisce la lunghezza della matrice. |
12 | public void set(int i, int newValue) Imposta l'elemento in posizione i sul valore dato. |
13 | public String toString() Restituisce la rappresentazione String dei valori correnti di array. |
14 | public boolean weakCompareAndSet(int i, int expect, int update) Atomicamente imposta l'elemento nella posizione i al valore aggiornato dato se il valore corrente == il valore atteso. |
Esempio
Il seguente programma TestThread mostra l'utilizzo della variabile AtomicIntegerArray in un ambiente basato su 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");
}
}
}
}
}
Questo produrrà il seguente risultato.
Produzione
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