Concurrencia de Java - Clase ThreadLocal

La clase ThreadLocal se usa para crear variables locales de subprocesos que solo pueden ser leídas y escritas por el mismo subproceso. Por ejemplo, si dos subprocesos acceden al código que hace referencia a la misma variable threadLocal, cada subproceso no verá ninguna modificación a la variable threadLocal realizada por otro subproceso.

Métodos ThreadLocal

A continuación se muestra la lista de métodos importantes disponibles en la clase ThreadLocal.

No Señor. Método y descripción
1

public T get()

Devuelve el valor en la copia del hilo actual de esta variable local del hilo.

2

protected T initialValue()

Devuelve el "valor inicial" del hilo actual para esta variable local del hilo.

3

public void remove()

Elimina el valor del hilo actual para esta variable local del hilo.

4

public void set(T value)

Establece la copia del hilo actual de esta variable local del hilo en el valor especificado.

Ejemplo

El siguiente programa TestThread muestra algunos de estos métodos de la clase ThreadLocal. Aquí hemos usado dos variables de contador, una es variable normal y otra es 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");
      }
   }
}

Esto producirá el siguiente resultado.

Salida

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

Puede ver que el valor del contador aumenta con cada hilo, pero threadLocalCounter sigue siendo 0 para cada hilo.