用ThreadLocal线程局部变量,模拟Hibernate的 SessionFactory.getCurrentSession()
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
//用ThreadLocal线程局部变量,模拟Hibernate的 SessionFactory.getCurrentSession();
public class HibernateUtil
{
//每线程都有一份Session
private static final ThreadLocal<Session> localSession = new ThreadLocal<Session>();
private static SessionFactory sessionFactory;
static
{
try
{
sessionFactory = new Configuration().configure()
.buildSessionFactory();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static Session getCurrentSession()
{
if(localSession.get() == null)
localSession.set(sessionFactory.openSession());
return localSession.get();
}
}
那么ThreadLocal怎样实现线程局部变量 呢??先不看JDK源码的话,最简就是每线程都增加一个private的属性XX,然后getXX()就
可以取得但这样每增加一个"线程局部变量"就要在java.lang.Thread里增加一个属性的话,那太多了,这太不好...
那JDK源码里是每个线程里都有一个Map,java.lang.Thread 里有个ThreadLocalMap threadLocals 的属性,里面存放
(ThreadLocal key,Object value)这样的<key,value>对,相当于每线程都有这个的Map: Map<ThreadLocal,Object>,
这样上述代码中,每线程都可以将 <localSession,Session> 这样的条目放进线程的ThreadLocalMap里...