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.