Concorrenza Java - Classe ThreadLocal
La classe ThreadLocal viene utilizzata per creare variabili locali del thread che possono essere lette e scritte solo dallo stesso thread. Ad esempio, se due thread accedono al codice che fa riferimento alla stessa variabile threadLocal, ogni thread non vedrà alcuna modifica alla variabile threadLocal eseguita da un altro thread.
Metodi ThreadLocal
Di seguito è riportato l'elenco dei metodi importanti disponibili nella classe ThreadLocal.
Sr.No. | Metodo e descrizione |
---|---|
1 | public T get() Restituisce il valore nella copia del thread corrente di questa variabile locale del thread. |
2 | protected T initialValue() Restituisce il "valore iniziale" del thread corrente per questa variabile locale del thread. |
3 | public void remove() Rimuove il valore del thread corrente per questa variabile locale del thread. |
4 | public void set(T value) Imposta la copia del thread corrente di questa variabile locale del thread sul valore specificato. |
Esempio
Il seguente programma TestThread mostra alcuni di questi metodi della classe ThreadLocal. Qui abbiamo usato due variabili contatore, una è normale e un'altra è ThreadLocal.
class RunnableDemo implements Runnable {
int counter;
ThreadLocal<Integer> threadLocalCounter = new ThreadLocal<Integer>();
public void run() {
counter++;
if(threadLocalCounter.get() != null) {
threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
} else {
threadLocalCounter.set(0);
}
System.out.println("Counter: " + counter);
System.out.println("threadLocalCounter: " + threadLocalCounter.get());
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo commonInstance = new RunnableDemo();
Thread t1 = new Thread(commonInstance);
Thread t2 = new Thread(commonInstance);
Thread t3 = new Thread(commonInstance);
Thread t4 = new Thread(commonInstance);
t1.start();
t2.start();
t3.start();
t4.start();
// wait for threads to end
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (Exception e) {
System.out.println("Interrupted");
}
}
}
Questo produrrà il seguente risultato.
Produzione
Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0
Puoi vedere che il valore di counter viene aumentato da ogni thread, ma threadLocalCounter rimane 0 per ogni thread.