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.