最近在做设计到多线程的一个小程序,老是会在数据并发时遇到数据不一致的情况。线程并发控制复杂度加大。
1.考虑用Synchonized来解决多线程并发遇到的问题,利用锁机制来处理让并发时数据一致,但根据我的情况,又觉得把问题复杂化,还没到线程间数据共享阶段。
今天在用Hibernate做DAO时,在用单列模式创建SessionFactory时,想看看官方的HibernateUtil是如何写的类呢?
其中用到了ThreadLocal,语意上本地线程?看看源代码。原来就是为了创建线程局部变量(ThreadLocal),其实功能很简单,就是为每一个使用该变量的线程都提供一个变量值的副本,也就是一种比较特殊线程绑定机制,让每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
GOOGLE到的总结:
通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM
为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。
从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
分享到:
相关推荐
管理hibernate的session sessionFactiory的实现类
HibernateUtil分装完整版HQL查询HibernateUtil分装完整版HQL查询
HibernateUtil 分页 增删改查 封装 HibernateUtil 分页 增删改查 封装 HibernateUtil 分页 增删改查 封装
HibernateUtil工具类
hibernate入门实例封装了HibernateUtil,完成数据库的添加操作,和查询操作。 Session的save方法和get方法。
06_传智播客hibernate教程_完善HibernateUtil类及hql查询入门
Hibernate5.2.1 的工具类 创建session 和 sessionFactory
欢迎大家咨询,我会尽量去与大家讲解,希望对你们有所帮助
HibernateUtil.java HibernateUtils.java HttpRequester.java HttpRespons.java HttpUtil.java MD5Util.java Pagination.java PropertiesUtil.java RegUtil.java StringUtil.java UploadUtil.java UUIDUtils.java
} <br> public String createPasswordTicket(User user) { HibernateUtil.executeUpdate( "delete from PasswordTicket as pt where pt.user=?", new Object[] { user } ); String ...
hibernate 一对多测试工程,博客介绍请参照: http://blog.csdn.net/smilefyx/article/details/48596665
一个工具类实现了增删改查 util comm.util beanutils 方便了获取session和sessionFactory
该程序演示了如何使用 Annotations 在 Hibernate 中使用继承。 Hibernate 支持 3 种类型的继承 每个具体类一个表 - 每个子类都有一个表,该表也具有超类的所有属性。 (TABLE_PER_CLASS) 每个层次结构类一个表 - ...
自己编写的HibernateUtil类,比较全面,方法均通过测试
SessionFactory factory = HibernateUtil.getSessionFactory(); Session session = factory.openSession(); Serializable id = null; Transaction tran = null; try{ tran = session.beginTransaction(); ...
作者 : 使用SSH框架实现99.99999%的功能 开发工具MyEclipse6.5.1 . 先在src下的jdbc.properties中配置数据库的信息(本项目使用的是Oracle) ...原创版本,如果下到其他雷同的,那就是从本人这里复制的哈
HibernateUtil工具类,封装了Hibernate的事务,增,删,改,查,以及分页的方法!
Hibernate继承 配置中的改进逻辑.....但是dint使用了HibernateUtil类 还利用了映射文件中的继承