ホームページ  >  記事  >  Java  >  JavaでThreadLocalを正しく使用するサンプルコード分析

JavaでThreadLocalを正しく使用するサンプルコード分析

黄舟
黄舟オリジナル
2017-03-27 10:11:491985ブラウズ

この記事では主に Java での ThreadLocal の正しい使い方に関する関連情報を紹介します。必要な方は Java での ThreadLocal の正しい使い方を参照してください

使い方 1: 関連するデータ クラスにプライベート static

ThreadLocalThreaLocal を作成する JDK ドキュメント状態: ThreadLocal インスタンスは通常、状態をスレッドに関連付けたいクラスのプライベート静的フィールドです。クラスを通じて状態 (ユーザー ID、トランザクション ID など) をスレッドに関連付けたい場合は、通常、プライベート静的型の ThreadLocal インスタンスがこのクラスで定義されます。

たとえば、以下のクラスでは、プライベート静的 ThreadLocal インスタンス (serialNum) は、クラスの静的 SerialNum.get() メソッドを呼び出す各スレッドの「シリアル番号」を維持します。このメソッドは、現在のシリアル番号を返します。糸 。 (スレッドのシリアル番号は、SerialNum.get()の初回呼び出し時に割り当てられ、以降の呼び出しでは変更されません。)

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(); 
  } 
}

【例】

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

使い方2: UtilクラスにThreadLocalを作成する

これは上記の使用法の拡張であり、ThreadLocal の作成をツール クラスに追加します。

[例] たとえば、休止状態ツール クラス:

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();
  }
}

使用法 3: Runnable で ThreadLocal を作成する

別の使用法は、スレッド クラス内に ThreadLocal を作成することです。 基本的な手順は次のとおりです。マルチスレッド クラス (ThreadDemo クラスなど) で、ThreadLocal
オブジェクト

threadXxx を作成し、スレッド間で分離する必要があるオブジェクト xxx を保存します。

2. ThreadDemo クラスでメソッド getXxx() を作成し、ThreadLocal オブジェクトが null の場合は、分離アクセス型のオブジェクトを new() する必要があると判断します。そして力の変換が適用されるタイプです。
3. ThreadDemo クラスの run() メソッドで、getXxx() メソッドを呼び出して操作対象のデータを取得します。これにより、各スレッドがデータ オブジェクトに対応し、このオブジェクトが常に操作されるようになります。

りー

以上がJavaでThreadLocalを正しく使用するサンプルコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。