ThreadLocal garantira que l'accès à l'objet mutable par les multiples threads de la méthode non synchronisée est synchronisé, ce qui signifie que l'objet mutable est immuable dans la méthode.
Ceci est réalisé en donnant une nouvelle instance d'objet mutable pour chaque thread essayez d'y accéder. Il s'agit donc d'une copie locale sur chaque thread. Il s'agit d'un hack sur la création d'une variable d'instance dans une méthode accessible comme une variable locale. Comme vous savez que la variable locale de méthode n'est disponible que pour le thread, une différence est; les variables locales de méthode ne seront pas disponibles pour le thread une fois l'exécution de la méthode terminée, car un objet mutable partagé avec threadlocal sera disponible sur plusieurs méthodes jusqu'à ce que nous le nettoyions.
Par définition:
La classe ThreadLocal en Java vous permet de créer des variables qui ne peuvent être lues et écrites que par le même thread. Ainsi, même si deux threads exécutent le même code et que le code a une référence à une variable ThreadLocal, les deux threads ne peuvent pas voir les variables ThreadLocal de l'autre.
Chacun Thread
en java en contient ThreadLocalMap
.
Où
Key = One ThreadLocal object shared across threads.
value = Mutable object which has to be used synchronously, this will be instantiated for each thread.
Atteindre le ThreadLocal:
Créez maintenant une classe wrapper pour ThreadLocal qui va contenir l'objet mutable comme ci-dessous (avec ou sans initialValue()
).
Maintenant, getter et setter de ce wrapper fonctionneront sur une instance threadlocal au lieu d'un objet mutable.
Si getter () de threadlocal n'a trouvé aucune valeur avec dans le threadlocalmap du Thread
; il invoquera ensuite initialValue () pour obtenir sa copie privée par rapport au thread.
class SimpleDateFormatInstancePerThread {
private static final ThreadLocal<SimpleDateFormat> dateFormatHolder = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd") {
UUID id = UUID.randomUUID();
@Override
public String toString() {
return id.toString();
};
};
System.out.println("Creating SimpleDateFormat instance " + dateFormat +" for Thread : " + Thread.currentThread().getName());
return dateFormat;
}
};
/*
* Every time there is a call for DateFormat, ThreadLocal will return calling
* Thread's copy of SimpleDateFormat
*/
public static DateFormat getDateFormatter() {
return dateFormatHolder.get();
}
public static void cleanup() {
dateFormatHolder.remove();
}
}
Maintenant wrapper.getDateFormatter()
, appellera threadlocal.get()
et vérifiera que currentThread.threadLocalMap
contient cette instance (threadlocal).
Si oui, retournez la valeur (SimpleDateFormat) pour l'instance threadlocal correspondante,
sinon ajoutez la carte avec cette instance threadlocal, initialValue ().
Ci-joint la sécurité du fil atteint sur cette classe mutable; par chaque thread travaille avec sa propre instance mutable mais avec la même instance ThreadLocal. Signifie que tout le thread partagera la même instance ThreadLocal comme clé, mais une instance SimpleDateFormat différente comme valeur.
https://github.com/skanagavelu/yt.tech/blob/master/src/ThreadLocalTest.java