理解java.lang.ThreadLocal 类

一、概述

 ThreadLoacl很容易让人望文生义,想当然认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,

 而是Thread 的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解。


 二、JDK API 1.6.0:

   public class ThreadLocal extends Object .

   ThreadLocal 提供了线程局部(thread-local)变量。这些变量不同于它们的普通 对应物,因为访问某个变量(通过其 get 或set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal实例通常是类中的private static 字段,它们希望将状态与某一个线程(例如,用户ID或事务ID)相关联。

  构造方法:ThreadLocal():创建一个线程本地变量

  方法摘要:

  ◆ T get():返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用该方法,则创建并初始化该副本。

   protected T initialValue():返回此线程局部变量的当前线程的”初始值“。

  ◆remove():移除此线程局部变量当前线程的值。

  ◆ set(T value):将此线程局部变量的当前线程副本中的值设置为指定值。


 三、应用举例

 HibernateSession 工具类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);
	}
	
}


你可能感兴趣的:(框架,java,ThreadLoacl)