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.