Java Language Usando ThreadLocal


Esempio

Uno strumento utile in Java Concurrency è ThreadLocal - questo ti permette di avere una variabile che sarà unica per un dato thread. Pertanto, se lo stesso codice viene eseguito in thread diversi, queste esecuzioni non condivideranno il valore, ma ogni thread ha una propria variabile che è locale al thread .

Ad esempio, questo è frequentemente usato per stabilire il contesto (come le informazioni di autorizzazione) della gestione di una richiesta in un servlet. Potresti fare qualcosa del genere:

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
    }
}

Ora, invece di passare MyUserContext in ogni singolo metodo, puoi invece utilizzare MyServlet.getContext() dove ti serve. Ora, naturalmente, questo introduce una variabile che deve essere documentata, ma è thread-safe, che elimina molti aspetti negativi nell'utilizzo di una variabile così ad alto scope.

Il vantaggio chiave qui è che ogni thread ha la propria variabile locale del thread nel contenitore dei contexts . Finché lo si utilizza da un punto di ingresso definito (come richiedere che ogni servlet mantenga il suo contesto, o magari aggiungendo un filtro servlet), si può fare affidamento sul fatto che questo contesto sia lì quando ne hai bisogno.