Java Concurrency - ThreadLocal-Klasse
Die ThreadLocal-Klasse wird verwendet, um lokale Thread-Variablen zu erstellen, die nur von demselben Thread gelesen und geschrieben werden können. Wenn beispielsweise zwei Threads auf Code zugreifen, der auf dieselbe threadLocal-Variable verweist, werden für jeden Thread keine Änderungen an der threadLocal-Variablen von einem anderen Thread vorgenommen.
ThreadLocal-Methoden
Im Folgenden finden Sie eine Liste wichtiger Methoden, die in der ThreadLocal-Klasse verfügbar sind.
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | public T get() Gibt den Wert in der aktuellen Thread-Kopie dieser thread-lokalen Variablen zurück. |
2 | protected T initialValue() Gibt den "Anfangswert" des aktuellen Threads für diese threadlokale Variable zurück. |
3 | public void remove() Entfernt den Wert des aktuellen Threads für diese threadlokale Variable. |
4 | public void set(T value) Setzt die Kopie dieser aktuellen threadlokalen Variablen des aktuellen Threads auf den angegebenen Wert. |
Beispiel
Das folgende TestThread-Programm demonstriert einige dieser Methoden der ThreadLocal-Klasse. Hier haben wir zwei Zählervariablen verwendet, eine ist eine normale Variable und eine andere ist 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");
}
}
}
Dies führt zu folgendem Ergebnis.
Ausgabe
Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0
Sie können sehen, dass der Wert des Zählers von jedem Thread erhöht wird, threadLocalCounter jedoch für jeden Thread 0 bleibt.