ThreadLocal管理下的Session
2016-04-04 13:50
351 查看
ThreadLocal并不是名字直接释义的线程本地实现版本,其实它是一个线程中的局部变量。
它的功能非常简单,就是为使用某一变量的线程提供一个该变量的副本,使其可以对该副本进行操作,而不会影响到其他线程中的该变量值。我们以线程中的Hibernate Session变量为例,来看一下它是怎么做到为每个线程都维护一个变量的副本。
再说明一下ThreadLocal实现线程局部变量的方式:
其实每个线程的内部都有一个Map,java.lang.Thread里有一个ThreadLocalMap threadLocals 属性,里面存放
<ThreadLocal Key , Object vlaue>这样的键值对。相当于每个线程里都有一个Map(ThreadLocal , Object),这样每个线程都可以将<localSession , Session >这样的数据放到ThreadLocalMap里。
在此管理方式下可以实现将创建的Session绑定到当前线程上。
它的功能非常简单,就是为使用某一变量的线程提供一个该变量的副本,使其可以对该副本进行操作,而不会影响到其他线程中的该变量值。我们以线程中的Hibernate Session变量为例,来看一下它是怎么做到为每个线程都维护一个变量的副本。
public class HibernateUtil { private static final ThreadLocal<Session> session = new ThreadLocal(); private static SessionFactory sessionFactory; static { try { sessionFactory=new Configuration().configure().buildSessionFactory(); } catch(Throwable ex) { System.err.println("创建sessionFactory失败:"+ex.getMessage()); } } public static Session getCurrentSession() { Session s = session.get(); //在线程局部变量中获取Session if(s==null) { s = sessionFactory.openSession(); session.set(s); //将新建的变量加入到线程局部变量中 } return s; }
再说明一下ThreadLocal实现线程局部变量的方式:
其实每个线程的内部都有一个Map,java.lang.Thread里有一个ThreadLocalMap threadLocals 属性,里面存放
<ThreadLocal Key , Object vlaue>这样的键值对。相当于每个线程里都有一个Map(ThreadLocal , Object),这样每个线程都可以将<localSession , Session >这样的数据放到ThreadLocalMap里。
在此管理方式下可以实现将创建的Session绑定到当前线程上。
相关文章推荐
- Android中layout_gravity和gravity的区别
- 计算机基础(1)-原码、反码、补码
- AB压力测试工具
- lintcode-medium-Permutations
- Ubuntu下图形界面SVN客户端-RabbitVCS的安装
- poj 3084 最小割
- AndroidEventBus源码分析
- CentOS7从ELRepo源中安装Nvidia显卡驱动
- Android Gradle Plugin指南(二)——基本项目
- 学习笔记 第六周 第二篇
- java虚拟机学习之内存管理
- NYOJ 12 喷水装置(二)
- JDK7 提供了 7 个阻塞队列
- Android开发环境搭建
- wav文件格式分析详解
- SimpleDateFormat 的 format 方法使用具体解释
- LAMP平台部署及应用
- android TextView里边实现图文混配效果
- 进军es6(2)---解构赋值
- 纽扣游戏---博弈