版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lycyl/article/details/80505575
在使用Hibernate的时候,各种CRDU操作大都是通过session来完成的。如何避免频繁地创建和销毁呢?在Hibernate中session是由SessionFactory创建的,SessionFactory是线程安全的,即多个并发的线程可以同时访问并从中获取与其他线程不同的一个session实例。但是,session非线程安全的。可以设想如果让多个线程去使用一个session,那么很有可能导致数据存储混乱,出现问题。
ThreadLocal的实现原理
threalocal类提供了线程局部变量,这些变量不同于一般的副本,因为通过get()或set()方法访问这些变量的线程它们都有自
己独立初始化的变量副本。
threalocal其实本质上是一个工具类,用来操作线程的一个类型为
ThreadLocalMap的
属性
threadLocals。
首先,理解ThreadLocalMap、ThreadLocal和Thread之间的关系。
ThreadLocalMap是ThreadLocal类内部维护的一个内部类,类似于Map。Thread有一个ThreadLocalMap类型的属性,叫作threadLocals。
所以
ThreadLocal是联系ThreadLocalMap和Thread的桥梁。
其次是ThreadLocal的核心方法
set(
T
value
),get(),
getMap(
Thread
t
),
initialValue(),
setInitialValue()。
set(T value)方法
set方法首先获取当前线程thread,再通过thread得到属性threadLocals
。如果对应的
t
hreadLocals
不为空,则以当前的
ThreadLocal对象作为key,
T
value作为map的value压入map。如果对应的threadLocals为空,那么就调用createMap
(
Thread
t
, T
firstValue
)方法,对当前线程的
threadLocals
属性进行初始化。
这样的话,传入的参数T value就成为了当前属性threadLocals
的元素,也就跟当前线程绑定了
其他的核心方法就不赘述了,可以参考源码。
下面进入正题,如何利用ThreadLocal实现高效率管理?
很简单,代码如下:
Session s = session.get();
if(s == null || !s.isOpen()) {
s = sessionFactory.openSession();
//绑定线程到当前线程thread
session.set(s);
}
return s;