Maison >Java >javaDidacticiel >Exemple d'analyse de code pour utiliser correctement ThreadLocal en Java
Cet article présente principalement des informations pertinentes sur l'utilisation correcte de ThreadLocal en Java. Les amis qui en ont besoin peuvent se référer à
L'utilisation correcte de ThreadLocal en Java
. Première utilisation : créez un statique privé dans la classe de données associée. La documentation JDK de ThreadLocalThreaLocal indique : Les instances ThreadLocal sont généralement des champs statiques privés dans les classes qui souhaitent associer un état à un thread. Si nous voulons associer un état (tel qu'un ID utilisateur, un ID de transaction) à un thread via une classe, alors une instance ThreadLocal de type statique privé est généralement définie dans cette classe.
Par exemple, dans la classe suivante, l'instance statique privée ThreadLocal (serialNum) maintient un "numéro de série" pour chaque thread qui appelle la méthode statique SerialNum.get() de la classe, qui renvoie la séquence actuelle du thread. nombre. (Le numéro de série du fil est attribué lors du premier appel de SerialNum.get() et ne change pas lors des appels suivants.)
public class SerialNum { // The next serial number to be assigned private static int nextSerialNum = 0; private static ThreadLocal serialNum = new ThreadLocal() { protected synchronized Object initialValue() { return new Integer(nextSerialNum++); } }; public static int get() { return ((Integer) (serialNum.get())).intValue(); } }
[Exemple]
public class ThreadContext { private String userId; private Long transactionId; private static ThreadLocal threadLocal = new ThreadLocal(){ @Override protected ThreadContext initialValue() { return new ThreadContext(); } }; public static ThreadContext get() { return threadLocal.get(); } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public Long getTransactionId() { return transactionId; } public void setTransactionId(Long transactionId) { this.transactionId = transactionId; } }
Utilisation 2 : Créer ThreadLocal dans la classe Util
Il s'agit d'une extension de l'utilisation ci-dessus, c'est-à-dire placer la création de ThreadLocal dans la classe utilitaire.
[Exemple] Par exemple, classe d'outils de mise en veille prolongée :
public class HibernateUtil { private static Log log = LogFactory.getLog(HibernateUtil.class); private static final SessionFactory sessionFactory; //定义SessionFactory static { try { // 通过默认配置文件hibernate.cfg.xml创建SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { log.error("初始化SessionFactory失败!", ex); throw new ExceptionInInitializerError(ex); } } //创建线程局部变量session,用来保存Hibernate的Session public static final ThreadLocal session = new ThreadLocal(); /** * 获取当前线程中的Session * @return Session * @throws HibernateException */ public static Session currentSession() throws HibernateException { Session s = (Session) session.get(); // 如果Session还没有打开,则新开一个Session if (s == null) { s = sessionFactory.openSession(); session.set(s); //将新开的Session保存到线程局部变量中 } return s; } public static void closeSession() throws HibernateException { //获取线程局部变量,并强制转换为Session类型 Session s = (Session) session.get(); session.set(null); if (s != null) s.close(); } }
Troisième utilisation : créer ThreadLocal dans Runnable
Il existe un autre way L'utilisation consiste à créer un ThreadLocal à l'intérieur de la classe thread. Les étapes de base sont les suivantes :
1 Dans une classe multithread (telle que la classe ThreadDemo), créez un ThreadLocalobject<.>threadXxx pour économiser l'espace entre les threads. Objet xxx qui doit être isolé et traité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!