Concurrence Java - Classe ThreadLocal

La classe ThreadLocal est utilisée pour créer des variables locales de thread qui ne peuvent être lues et écrites que par le même thread. Par exemple, si deux threads accèdent à du code faisant référence à la même variable threadLocal, chaque thread ne verra aucune modification de la variable threadLocal effectuée par un autre thread.

Méthodes ThreadLocal

Voici la liste des méthodes importantes disponibles dans la classe ThreadLocal.

N ° Sr. Méthode et description
1

public T get()

Renvoie la valeur de la copie du thread actuel de cette variable locale du thread.

2

protected T initialValue()

Renvoie la "valeur initiale" du thread actuel pour cette variable locale du thread.

3

public void remove()

Supprime la valeur du thread actuel pour cette variable locale du thread.

4

public void set(T value)

Définit la copie du thread actuel de cette variable locale du thread sur la valeur spécifiée.

Exemple

Le programme TestThread suivant illustre certaines de ces méthodes de la classe ThreadLocal. Ici, nous avons utilisé deux variables de compteur, l'une est la variable normale et l'autre est 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");
      }
   }
}

Cela produira le résultat suivant.

Production

Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0

Vous pouvez voir que la valeur de counter est augmentée par chaque thread, mais threadLocalCounter reste 0 pour chaque thread.