Java Language Utiliser ThreadLocal


Exemple

Un outil utile dans la concurrence Java est ThreadLocal - cela vous permet d'avoir une variable qui sera unique à un thread donné. Ainsi, si le même code s'exécute dans des threads différents, ces exécutions ne partageront pas la valeur, mais chaque thread aura sa propre variable locale au thread .

Par exemple, cela est fréquemment utilisé pour établir le contexte (tel que les informations d'autorisation) du traitement d'une demande dans une servlet. Vous pourriez faire quelque chose comme ceci:

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

Maintenant, au lieu de passer MyUserContext à chaque méthode, vous pouvez utiliser MyServlet.getContext() là où vous en avez besoin. Maintenant, bien sûr, cela introduit une variable qui doit être documentée, mais elle est adaptée aux threads, ce qui élimine beaucoup des inconvénients liés à l'utilisation d'une telle variable.

Le principal avantage est que chaque thread a sa propre variable locale de thread dans ce conteneur de contexts . Tant que vous l'utilisez à partir d'un point d'entrée défini (comme si vous exigiez que chaque servlet conserve son contexte, ou peut-être en ajoutant un filtre de servlet), vous pouvez compter sur ce contexte lorsque vous en avez besoin.