Descripción general de ThreadLocal en Java

Muhammad Adil 11 diciembre 2023
  1. Uso principal de la variable ThreadLocal
  2. usar un ThreadLocal en Java
Descripción general de ThreadLocal en Java

ThreadLocal es una poderosa herramienta en el lenguaje Java que permite a los desarrolladores crear variables específicas para cada hilo de ejecución. Esto significa que cada hilo tiene su copia de la variable, independientemente de los valores de la misma variable en otros hilos.

Esto es particularmente útil en aplicaciones de subprocesos múltiples, donde diferentes subprocesos pueden tener diferentes requisitos para una variable determinada y donde los cambios en el valor de una variable en un subproceso no deberían afectar el valor de la misma variable en otro subproceso.

Uso principal de la variable ThreadLocal

El principal caso de uso de ThreadLocal es almacenar un estado por subproceso, como un ID de usuario o ID de transacción, que es específico para una sola solicitud y no debe compartirse entre diferentes solicitudes.

Por ejemplo, considere una aplicación web que utiliza una sola conexión de base de datos para manejar múltiples solicitudes de usuarios. Sin ThreadLocal, sería difícil garantizar que cada solicitud utilice la información de usuario correcta, ya que varios subprocesos podrían ejecutar varias solicitudes simultáneamente e interferir entre sí.

Con ThreadLocal, cada hilo puede almacenar su información de usuario, que será utilizada por la conexión de base de datos asociada con ese hilo.

usar un ThreadLocal en Java

Para usar ThreadLocal en Java, declara una nueva instancia de la clase ThreadLocal y luego usa sus métodos get() y set() para acceder y modificar el valor asociado con el hilo actual.

Por ejemplo, el siguiente código demuestra el uso de un ThreadLocal para almacenar una ID de usuario para cada hilo.

public class Main {
  public static void main(String args[]) {
    ThreadLocal<Integer> localVariable = new ThreadLocal<>();
    localVariable.set(10);
    // get the value for the current thread
    System.out.println("Value of localVariable in current thread: " + localVariable.get());
  }
}

Cuando crea una variable ThreadLocal, cada subproceso que accede a ella tiene su instancia separada de la variable. Esto significa que cada subproceso puede almacenar un valor diferente para la misma variable ThreadLocal, y cuando acceda a la variable, obtendrá el valor establecido para ese subproceso específico.

Esto puede ser útil en entornos de subprocesos múltiples, donde debe almacenar datos específicos de subprocesos que no deben compartirse entre subprocesos.

Por ejemplo, puede utilizar una variable ThreadLocal para almacenar información como el ID de usuario o el ID de transacción de un subproceso específico para realizar un seguimiento de los datos de ese subproceso, incluso si se ejecutan varios subprocesos simultáneamente.

Es importante tener en cuenta que ThreadLocal no elimina automáticamente su valor cuando finaliza el hilo que lo creó. Esto puede provocar fugas de memoria, ya que los valores asociados con los subprocesos terminados seguirán ocupando memoria.

Se recomienda usar el método remove() de la clase ThreadLocal o usar la instrucción try-with-resources en Java 7 y versiones posteriores para evitar esto. Por ejemplo:

try (ThreadLocalCleanup cleanup = new ThreadLocalCleanup(userId)) {
  // use the ThreadLocal variable here
}

En este ejemplo, la clase ThreadLocalCleanup implementa la interfaz AutoCloseable, que permite su uso con la instrucción try-with-resources.

Cuando se sale de la instrucción try-with-resources, se llama automáticamente al método close() de la clase ThreadLocalCleanup, que elimina el valor asociado con el hilo actual de la variable ThreadLocal.

Haga clic aquí para comprobar el funcionamiento del código mencionado anteriormente.

Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook

Artículo relacionado - Java Thread