一、概述
ThreadLoacl很容易让人望文生义,想当然认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,
而是Thread 的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解。
二、JDK API 1.6.0:
public class ThreadLocal
ThreadLocal 提供了线程局部(thread-local)变量。这些变量不同于它们的普通 对应物,因为访问某个变量(通过其 get 或set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal实例通常是类中的private static 字段,它们希望将状态与某一个线程(例如,用户ID或事务ID)相关联。
构造方法:ThreadLocal():创建一个线程本地变量
方法摘要:
◆ T get():返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用该方法,则创建并初始化该副本。
◆ protected T initialValue():返回此线程局部变量的当前线程的”初始值“。
◆remove():移除此线程局部变量当前线程的值。
◆ set(T value):将此线程局部变量的当前线程副本中的值设置为指定值。
三、应用举例
Hibernate的Session 工具类HibernateUtil
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sf;
private static ThreadLocal tl =
new ThreadLocal();
static{
Configuration conf =
new Configuration();
conf.configure("/hibernate.cfg.xml");
sf = conf.buildSessionFactory();
}
public static Session getSession(){
Session session = tl.get();
if(session == null ||
!session.isOpen()){
session = sf.openSession();
tl.set(session);
}
return session;
}
public static void closeSession(){
Session session = tl.get();
tl.set(null);
if(session != null){
session.close();
}
}
public static void main(String[] args){
Session session1 = getSession();
Session session2 = getSession();
System.out.println(session1==session2);
}
}