ThreadLocal类为什么要加上static修饰
2016-01-17 18:04
891 查看
问题的来源是:
在我写一个OpenSessionFilterInView的时候(当然Spring已经有了这个功能),需要在view中这里也就是在Filter中从spring工厂的hibernate sessionFactory中获取一个session,并且需要把session传到DAO当中,那么问题来了,如果ThreadLocal是静态的,那么多线程并发的时候 主存中只有一个ThreadLocal,每个线程都set一次,那不同线程get的时候不是乱套了?
其实并不是这样,虽然在某个类中,这里是Filter类,ThreadLocal是静态的,只有一个,但是它所持有的变量,这里是session 在不同线程中是不一样的,不存在session乱套的问题。这也是ThreadLocal的特别之处,退一步说,若ThreadLocal是一个普通的类,它若是static,那么它持有的变量,在多线程时候,肯定会产生冲突。
ThreadLocal: 它的作用只是在当前线程中,共享一个值,可以是session connection等等,这个值在每个线程都是不一样的,也不存在什么线程安全的问题,也不需要线程安全。
有一篇文章对ThreadLocal讲的很好 :http://zhangbo-peipei-163-com.iteye.com/blog/20285
在我写一个OpenSessionFilterInView的时候(当然Spring已经有了这个功能),需要在view中这里也就是在Filter中从spring工厂的hibernate sessionFactory中获取一个session,并且需要把session传到DAO当中,那么问题来了,如果ThreadLocal是静态的,那么多线程并发的时候 主存中只有一个ThreadLocal,每个线程都set一次,那不同线程get的时候不是乱套了?
其实并不是这样,虽然在某个类中,这里是Filter类,ThreadLocal是静态的,只有一个,但是它所持有的变量,这里是session 在不同线程中是不一样的,不存在session乱套的问题。这也是ThreadLocal的特别之处,退一步说,若ThreadLocal是一个普通的类,它若是static,那么它持有的变量,在多线程时候,肯定会产生冲突。
ThreadLocal: 它的作用只是在当前线程中,共享一个值,可以是session connection等等,这个值在每个线程都是不一样的,也不存在什么线程安全的问题,也不需要线程安全。
举例:private static ThreadLocal<Connection> t1 = new ThreadLocal<Connection>
这条语句的意思是:声明了一个 ThreadLocal 变量t1,t1可以为每一个引用该类的线程保存Connection类型的对象。
当多个线程都是用这个类时, 每个线程可以将自己的Connection对象,保存在t1中,各个线程中的Connection对象不会交叉混乱,
当各个线程要使用自己的Connection时,只需要要调用 t1.Get(),返回的必然是当前线程保存的那个Connection。 总而言之,ThreadLocal就是 线程 局部 变量,同时它是泛型的,<>中的类型,就是局部变量的类型。
使用Set方法来设置局部变量的值,使用Get方法来获取局部变量的值。
有一篇文章对ThreadLocal讲的很好 :http://zhangbo-peipei-163-com.iteye.com/blog/20285
相关文章推荐
- hihocoder #1136 : Professor Q's Software
- [转载]TFS源代码管理
- hdu 2586 How far away ? ( 离线 LCA , tarjan )
- VS2013使用winsock.h和winsock2.h发生冲突后的终极解决方法
- 单用户模式
- 关于跨域
- jQuery插件开发的五种形态小结
- HDU 1075 翻译 (字典树||map)
- trait学习 笔记整理
- Android调用系统相机、自己定义相机、处理大图片
- 针对不同包之间的action跳转,怎么配置?
- js中css样式的操作
- ORA-01078 和 LRM-00109 报错解决方法 及oracle数据库的几个名称
- CDH使用之CM 5.3.x安装(转)
- Android学习笔记-使用Scroller来滚动视图
- 解决iOS隐藏导航栏问题
- Python: Windows下pip安装库出错:Microsoft Visual C++ 9.0 is required < Unable to find vcvarsall.bat
- 员工每天干不同的产品,得到不同的产量工资,然后月底需要按月汇总,月度汇总是从上个月26号到这个月25号为一个计算月
- 多元函数的极值及其求法
- 钉钉服务器端SDK PHP版