> Java > java지도 시간 > 본문

Java에서 ThreadLocal을 올바르게 사용하는 예제 코드 분석

黄舟
풀어 주다: 2017-03-27 10:11:49
원래의
1975명이 탐색했습니다.

이 글에서는 주로 Java에서 ThreadLocal의 올바른 사용법에 대한 관련 정보를 소개합니다. 필요한 친구는

Java에서 ThreadLocal의 올바른 사용법

을 참고하세요. 사용법 1: 연결된 데이터 클래스에 private 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의 기본 단계는 다음과 같습니다.

1. 다중 스레드 클래스(예: ThreadDemo 클래스)에서 ThreadLocal 객체 threadXxx를 생성하여 스레드 간 격리가 필요합니다. 처리할 개체는 xxx입니다.

2. ThreadDemo 클래스에서 getXxx() 메서드를 생성하여 별도로 액세스할 데이터를 가져옵니다. ThreadLocal 개체가 null인 경우 new()를 수행해야 하는지 판단합니다. 격리 액세스 유형을 개체로 지정하고 적용할 유형으로 캐스팅합니다.

3. ThreadDemo 클래스의 run() 메소드에서 getXxx() 메소드를 호출하여 조작할 데이터를 얻습니다. 이렇게 하면 각 스레드가 데이터 객체에 대응하고 조작할 수 있습니다. 언제든지 이 개체입니다.

아아아아

위 내용은 Java에서 ThreadLocal을 올바르게 사용하는 예제 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!