Maison  >  Article  >  Java  >  Fil local Java (ThreadLocal)

Fil local Java (ThreadLocal)

黄舟
黄舟original
2017-02-28 10:52:492172parcourir

La classe ThreadLocal en Java garantit que les variables que vous créez ne peuvent être lues et écrites que par le même thread. Par conséquent, même si deux threads exécutent le même code et que ce code a une référence à une variable ThreadLocal, les deux threads ne peuvent pas voir les variables ThreadLocal de l'autre.

Créer un ThreadLocal

Voici un code montrant comment créer un ThreadLocal :

private ThreadLocal myThreadLocal = new ThreadLocal();


Comme vous le voyez, vous instanciez un nouvel objet ThreadLocal. Cela ne doit être fait qu’une seule fois par thread. Même si différents threads exécutent le même code qui accède à un ThreadLocal, chaque thread ne verra que sa propre instance ThreadLocal. Même si deux threads définissent des valeurs différentes sur le même objet ThreadLocal, ils ne verront pas les valeurs de chacun.

Accès à un ThreadLocal

Une fois qu'un ThreadLocal est créé, vous pouvez définir une valeur à stocker comme ceci :

myThreadLocal.set("A thread local value");

Vous pouvez lire la valeur comme ceci :

String threadLocalValue = (String) myThreadLocal.get();

La méthode get renvoie un objet et la méthode set passe un objet en paramètre.

ThreadLocal générique

Vous pouvez créer un ThreadLocal générique afin de ne pas avoir à le faire lors de l'appel de la méthode get Conversion forcée. Voici un exemple :

private ThreadLocal<String> myThreadLocal = new ThreadLocal<String>();

Vous pouvez désormais stocker uniquement les types de chaînes dans les instances ThreadLocal. De plus, vous n'avez pas besoin de forcer la conversion de cette valeur :

myThreadLocal.set("Hello ThreadLocal");

String threadLocalValue = myThreadLocal.get();


Initialisez la valeur ThreadLocal

car le paramètre un objet ThreadLocal La valeur n'est visible que par le thread qui a défini cette valeur, donc aucun thread ne peut utiliser la méthode set pour définir la valeur de ThreadLocal pour qu'elle soit visible par tous les threads.

Au lieu de cela, vous pouvez spécifier une valeur initiale pour un objet ThreadLocal en sous-classant ThreadLocal et en remplaçant la méthode initialValue. Comme ceci :


private ThreadLocal myThreadLocal = new ThreadLocal<String>() {
    @Override protected String initialValue() {
        return "This is the initial value";
    }
};


Désormais, tous les threads peuvent voir la même valeur d'initialisation, avant d'appeler la méthode set.

Instance ThreadLocal complète

Voici une instance ThreadLocal entièrement exécutée

public class ThreadLocalExample {


    public static class MyRunnable implements Runnable {

        private ThreadLocal<Integer> threadLocal =
               new ThreadLocal<Integer>();

        @Override
        public void run() {
            threadLocal.set( (int) (Math.random() * 100D) );
    
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
            }
    
            System.out.println(threadLocal.get());
        }
    }


    public static void main(String[] args) {
        MyRunnable sharedRunnableInstance = new MyRunnable();

        Thread thread1 = new Thread(sharedRunnableInstance);
        Thread thread2 = new Thread(sharedRunnableInstance);

        thread1.start();
        thread2.start();

        thread1.join(); //wait for thread 1 to terminate
        thread2.join(); //wait for thread 2 to terminate
    }

}

Cet exemple crée une instance distincte de MyRunnable, qui est transmis à deux threads différents. Les deux threads ont exécuté la méthode run et défini des valeurs différentes sur l'instance ThreadLocal. Si l'appel à cette méthode set est synchrone et qu'il n'utilise pas d'objet ThreadLocal, le deuxième thread écrasera la valeur définie par le premier thread.

Cependant, puisqu'il s'agit d'un objet ThreadLocal, ils ne peuvent pas voir les valeurs de chacun. Par conséquent, ils définissent et obtiennent des valeurs différentes.

InheritableThreadLocal

Cette classe InheritableThreadLocal est une sous-classe de la classe ThreadLocal. Au lieu que chaque thread ait sa propre valeur dans un ThreadLoca, cette classe permet d'accéder à la valeur d'un thread et de tous les threads enfants créés par ce thread.

Ce qui précède est le contenu du fil local Java (ThreadLocal). Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn