`

threadlocal threadlocalMap 在hibernate spring中的应用

 
阅读更多
之前看资料,总说spring hibernate 是通过threadlocal来实现并发。
更详细的就是session的产生是由threadlocal来实现并发控制,保证多线程安全。
但是只看讲解,真是不理解,时时如鲠在喉。今狠下心看了下源码,终于自认为搞明白了。
实际上就是一个threadlocal实例变量,这个类有get,set方法,且这个方法的特殊之处就在于能得到或设定线程的静态变量threadlocalMap的值,且threadlocalMap的key为该threadlocal实例变量!


根据个人理解详细如下:
sessionFactory 由spring的LocalSessionFactoryBean来产生。

在LocalSessionFactoryBean中,通过一系列的方法调用,最终会产生一个SessionFactoryImpl实例,这个实例就是spring容器管理的sessionFactory 。

每一个HibernateTemplate都会持有这同一个sessionFactory 的引用

当调用HibernateTemplate.getSession方法时,实际上是调用的SessionFactoryImpl的currentSessionContext的getCurrentSession()方法。在这个方法中会通过currentSessionContext所持有的ThreadLocal实例对象,去查询当前线程的静态变量ThreadLocalMap中是否保存有以currentSessionContext所持有的ThreadLocal实例对象为key对应的Map,且Map中有以当前sessionFactory 为key对应的session,有则用之,无则新建session并保存。

最终,一个thread的ThreadLocalMap状态如下
thread_1
        ThreadLocalMap
                      table[Entiry](是一个数组 Entity[] table)
                      table[i]为 <ThreadLocal实例对象, Map<sessionfactory, session > >

其实就是ThreadLocalMap中有一个数组,数组中的每一个Entity,持有不同的threadlocal实例变量 和 Value.
当调用Threadlocal实例变量的get方法时,先取得当前线程的threadlocalmap变量,然后依次遍历该threadlocalmap变量中的table[entity],看哪一个entity持有的Threadlocal实例变量与当前的相匹配,匹配的话则取得对应的entity的value的值。

在hibernate的这里实际应用为:为一个Map且这个Map中也有一个映射,key为HibernateTemplate所持有的sessionFactory ,值为曾将创建过的session。简而言之,就是双重Map!!!ThreadLocalMap的key对应的值为Map类型的目的是区分不同的sessionFactory 对应的session。

这样,当不同的客户请求时,服务器负责产生不同的thread来处理客户的request,对于不同的thread,由同一个ThreadLocal实例变量来负责为不同的thread绑定对应的session。同一线程对应同一客户,就能保证具有同一个session。
分享到:
评论

相关推荐

    从ThreadLocal的使用到Spring的事务管理

    例如,在Web应用服务器中,我们可以用ThreadLocal存储用户的会话信息,确保每个请求都访问到自己专属的数据。 ThreadLocal的使用通常包括以下步骤: 1. 创建ThreadLocal实例,声明变量类型。 2. 在需要的地方,通过...

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

    Spring事务处理-ThreadLocal的使用

    在实际应用中,理解ThreadLocal在Spring事务处理中的作用有助于优化并发性能和解决多线程环境下的事务问题。例如,如果线程之间需要共享数据,但又不想影响其他线程,ThreadLocal就是一个理想的选择。同时,也要注意...

    ThreadLocal原理及在多层架构中的应用

    - **弱引用**:ThreadLocalMap的键使用的是弱引用,当ThreadLocal变量不再被引用时,垃圾收集器可以回收ThreadLocal对象,但其在ThreadLocalMap中的引用不会立即被移除,以防止导致内存泄漏。 - **线程生命周期**:...

    ThreadLocal原理及在多层架构中的应用.pdf

    在Java中,ThreadLocal被广泛应用于Web中间件、服务端编程和微服务架构中,用以解决多线程环境下的数据隔离问题。 首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程...

    Spring定时任务中使用ThreadLocal的坑

    NULL 博文链接:https://bijian1013.iteye.com/blog/2380233

    java之hibernate和spring技术难点及其要点总结

    在Java开发领域,Hibernate和Spring作为两个非常重要的框架,对于提高应用程序的开发效率、降低维护成本具有不可替代的作用。本文将针对这两个技术栈中的关键知识点进行深入探讨,并结合实际应用场景,帮助开发者更...

    java中ThreadLocal详解

    在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,可能会引发线程安全问题。而`ThreadLocal`则提供了另一种...

    ThreadLocal的简单理解.doc

    最后,Thread 类是线程类,在这个类中存在一个 threadLocals 变量,具体的类型是 ThreadLocal.ThreadLocalMap。 五、ThreadLocal 如何实现 set 方法 set 方法的实现非常重要,它的实现过程如下: 1. 获取当前线程...

    ThreadLocal的几种误区

    3. 存储数据库会话:在Spring Hibernate ORM中,ThreadLocal常用来保存数据库连接的Session,确保每个线程有自己的Session,避免线程间的资源冲突。 总之,ThreadLocal是一个强大的工具,但理解其工作原理和潜在...

    ThreadLocal

    这个副本存储在线程的ThreadLocalMap中,这个Map是由Thread类维护的,键是ThreadLocal对象,值是线程局部变量的副本。 使用ThreadLocal的步骤如下: 1. 创建ThreadLocal实例。 2. 使用`set`方法设置线程局部变量的...

    Struts+Hibernate+Spring常见面试题

    3. 熟悉Spring的AOP和IOC概念,理解它们在Spring中的应用。 4. 掌握Hibernate的查询方式,理解load()和get()的区别。 5. 熟悉Tiles框架,它是如何实现Web页面模板化。 6. 对应用服务器的概念有所了解,例如BEA ...

    java 简单的ThreadLocal示例

    - 当你对ThreadLocal进行`set()`操作时,实际上是将值放入了当前线程的ThreadLocalMap中,键是ThreadLocal对象本身,值是你设置的对象。 - 当你调用`get()`时,它会查找当前线程的ThreadLocalMap,找到对应的键(即...

    正确理解ThreadLocal.pdf

    在实际应用中,如上文所示的Hibernate示例,通过`set()`方法可以将`Session`对象与当前线程绑定,而`get()`方法则用于获取当前线程的`Session`对象。这种设计模式避免了在多线程环境中直接操作共享资源可能带来的...

    使用ThreadLocal管理“session”数据

    在实际开发中,有些框架如Spring已经内置了对ThreadLocal的管理和清理机制,可以更方便地在多线程环境中使用session。 总结,ThreadLocal是Java中处理线程局部数据的利器,特别适用于需要线程隔离的场景,如Web...

    JDK的ThreadLocal理解(一)使用和测试

    需要注意的是,ThreadLocal中的变量并不是存储在堆内存中,而是存储在线程的ThreadLocalMap中。 ```java ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal(); threadLocal.set("线程A的值"); // 在线程A中,可以...

    ThreadLocal_ThreadLocal源码分析_

    在ThreadLocal中,每个实例都有一个内部Map,这个Map存储了键值对,键是ThreadLocal实例,值就是线程本地的变量副本。在JDK 8之前,这个内部Map是`ThreadLocal.ThreadLocalMap`,而从JDK 8开始,改为了`...

    java中ThreadLocal类的使用

    2. **请求上下文**:在Web应用中,可以使用`ThreadLocal`保存HttpServletRequest或Session对象,方便在同一个请求处理链路中访问。 3. **线程状态**:记录线程执行过程中的状态,例如事务管理、计数器等。 然而,...

    Java中ThreadLocal的设计与使用

    由于ThreadLocal变量是存储在线程的ThreadLocalMap中,如果线程长时间运行并且不清理ThreadLocal,当ThreadLocal对象被垃圾收集时,其在ThreadLocalMap中的引用将变为"幽灵引用"(弱引用),导致内存泄漏。...

Global site tag (gtag.js) - Google Analytics