Java Language Usando ThreadLocal


Ejemplo

Una herramienta útil en Java Concurrency es ThreadLocal : esto le permite tener una variable que será única para un hilo determinado. Por lo tanto, si el mismo código se ejecuta en subprocesos diferentes, estas ejecuciones no compartirán el valor, sino que cada subproceso tiene su propia variable que es local al subproceso .

Por ejemplo, esto se usa con frecuencia para establecer el contexto (como la información de autorización) del manejo de una solicitud en un servlet. Podrías hacer algo como esto:

private static final ThreadLocal<MyUserContext> contexts = new ThreadLocal<>();

public static MyUserContext getContext() {
    return contexts.get(); // get returns the variable unique to this thread
}

public void doGet(...) {
    MyUserContext context = magicGetContextFromRequest(request); 
    contexts.put(context); // save that context to our thread-local - other threads
                           // making this call don't overwrite ours
    try {
        // business logic
    } finally {
        contexts.remove(); // 'ensure' removal of thread-local variable
    }
}

Ahora, en lugar de pasar MyUserContext a cada método, puede usar MyServlet.getContext() donde lo necesite. Ahora, por supuesto, esto introduce una variable que necesita ser documentada, pero es segura para subprocesos, lo que elimina muchas de las desventajas de usar una variable de alto alcance.

La ventaja clave aquí es que cada hilo tiene su propia variable local de hilo en ese contenedor de contexts . Siempre que lo use desde un punto de entrada definido (como exigir que cada servlet mantenga su contexto, o quizás agregando un filtro de servlet) puede confiar en que este contexto estará allí cuando lo necesite.