最近在做设计到多线程的一个小程序,老是会在数据并发时遇到数据不一致的情况。线程并发控制复杂度加大。
1.考虑用Synchonized来解决多线程并发遇到的问题,利用锁机制来处理让并发时数据一致,但根据我的情况,又觉得把问题复杂化,还没到线程间数据共享阶段。
今天在用Hibernate做DAO时,在用单列模式创建SessionFactory时,想看看官方的HibernateUtil是如何写的类呢?
其中用到了ThreadLocal,语意上本地线程?看看源代码。原来就是为了创建线程局部变量(ThreadLocal),其实功能很简单,就是为每一个使用该变量的线程都提供一个变量值的副本,也就是一种比较特殊线程绑定机制,让每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
GOOGLE到的总结:
通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM
为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。
从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
分享到:
相关推荐
3. 缓存SessionFactory:初始化完成后,SessionFactory被缓存在HibernateUtil中,后续请求可以直接复用,无需重复初始化。 4. Session管理:HibernateUtil提供get Session()方法,根据需要创建或返回已存在的...
在这个例子中,getSession()方法会检查ThreadLocal中是否存在Session,若不存在则创建并设置,而closeSession()方法则负责关闭并移除当前线程的Session副本。 总结来说,ThreadLocal是Java中解决多线程数据隔离问题...
例如,在 HibernateUtil 类中,我们可以定义一个 ThreadLocal 变量来保存 Hibernate 的 Session。 ```java public class HibernateUtil { private static Log log = LogFactory.getLog(HibernateUtil.class); ...
每当线程开始处理请求时,会从ThreadLocal中获取或创建一个新的Session。 4. **Session的生命周期管理**:每个线程在开始操作数据库之前,从ThreadLocal获取Session;完成后,关闭Session并清理ThreadLocal中的引用...
- **实现原理**:通过在 ThreadLocal 类中维护一个 Map 结构来存储每个线程的变量副本。 **应用场景**: - 在多线程环境中,避免共享资源竞争,如数据库连接、Session 等。 - 避免使用 synchronized 同步机制带来的...
在Web应用中,通常使用Servlet容器如Tomcat,它支持ThreadLocal机制,能够为每个请求创建并维护一个独立的Session对象。这种方式称为“ThreadLocal Session”。 使用ThreadLocal Session的一个关键好处是事务的自动...
ThreadLocal变量可以绑定到处理请求的线程,使得代码能方便地访问Session,而事务上下文环境也可存储在ThreadLocal中,根据所选的事务划分机制进行管理。这种方式被称为ThreadLocal Session和Open Session in View...
在HibernateUtil类中,`currentSession()`方法用于获取或创建新的Session,`closeSession()`用于关闭Session。 9. **ThreadLocal变量**: `session`是一个ThreadLocal变量,这样每个线程都有自己的Session实例,避免...
在工程中新建一个包,例如***.zjut.dao,然后创建一个DAO操作辅助类HibernateUtil.java。这个类的目的是为了方便生成Configuration对象和SessionFactory对象,并且使用ThreadLocal保证每个线程都有一份独立的Session...
1. **减少代码耦合度**:将事务管理逻辑从业务逻辑层抽离出来,可以降低各层之间的依赖关系,提高系统的可维护性。 2. **统一事务管理**:通过一个统一的工具类来管理所有的事务,可以保证事务的一致性,避免因为...
private static final ThreadLocal<Session> threadLocal = new ThreadLocal(); private static Configuration configuration = new Configuration(); private static SessionFactory sessionFactor ``` - `...
在Hibernate3中,推荐使用ThreadLocal模式来管理Session,这可以确保每个线程都有自己的Session实例,避免了并发问题。此外,SessionFactory.getCurrentSession()方法提供了一种便捷的方式来获取当前线程的Session...
标题“SSH整合中 hibernate托管给Spring...HibernateUtil工具类的使用,以及如何在整合中使用Thread级别的Session管理。同时,也展示了不使用Spring托管的情况下,Hibernate如何通过配置文件独立管理SessionFactory。
在提供的部分代码中,我们可以看到一个名为`HibernateUtil`的工具类,该类负责管理`SessionFactory`和`Session`对象。 - **SessionFactory**: 是Hibernate的核心对象之一,它是线程安全的,负责创建`Session`对象。...