Maison > Java > javaDidacticiel > le corps du texte

Exemple d'analyse de code pour utiliser correctement ThreadLocal en Java

黄舟
Libérer: 2017-03-27 10:11:49
original
1997 Les gens l'ont consulté

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(); 
  } 
}
Copier après la connexion

[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;
 }
 
}
Copier après la connexion

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();
  }
}
Copier après la connexion

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é.

2. Dans la classe ThreadDemo, créez une méthode getXxx() pour obtenir les données auxquelles accéder de manière isolée. Jugez dans la méthode que si l'objet ThreadLocal est nul, vous devez new() un. type d’accès d’isolation et converti en type à appliquer.


3. Dans la méthode run() de la classe ThreadDemo, obtenez les données à exploiter en appelant la méthode getXxx(). Cela garantit que chaque thread correspond à un objet de données et peut être exploité. à tout moment est cet objet.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal