Simultaneidade Java - classe ThreadLocal

A classe ThreadLocal é usada para criar variáveis ​​locais de thread que só podem ser lidas e escritas pela mesma thread. Por exemplo, se dois encadeamentos estão acessando o código com referência à mesma variável threadLocal, cada encadeamento não verá nenhuma modificação na variável threadLocal feita por outro encadeamento.

Métodos ThreadLocal

A seguir está a lista de métodos importantes disponíveis na classe ThreadLocal.

Sr. Não. Método e Descrição
1

public T get()

Retorna o valor na cópia do segmento atual desta variável local do segmento.

2

protected T initialValue()

Retorna o "valor inicial" do segmento atual para esta variável local do segmento.

3

public void remove()

Remove o valor do segmento atual para esta variável local do segmento.

4

public void set(T value)

Define a cópia do segmento atual desta variável local do segmento para o valor especificado.

Exemplo

O programa TestThread a seguir demonstra alguns desses métodos da classe ThreadLocal. Aqui usamos duas variáveis ​​de contador, uma é a variável normal e outra é 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");
      }
   }
}

Isso produzirá o seguinte resultado.

Resultado

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

Você pode ver que o valor de counter é aumentado em cada thread, mas threadLocalCounter permanece 0 para cada thread.