用ThreadLocal,模拟Hibernate getCurrentSession()

本文通过模拟Hibernate的SessionFactory.getCurrentSession()方法,介绍了如何使用ThreadLocal实现线程局部变量。每线程都拥有独立的Session实例,确保了线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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里...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值