ThreadLocal类为什么要加上static修饰

问题的来源是:

   在我写一个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 变量t1t1可以为每一个引用该类的线程保存Connection类型的对象。  
当多个线程都是用这个类时, 每个线程可以将自己的Connection对象,保存在t1中,各个线程中的Connection对象不会交叉混乱,
当各个线程要使用自己的Connection时,只需要要调用 t1.Get(),返回的必然是当前线程保存的那个Connection。
总而言之,ThreadLocal就是 线程 局部 变量,同时它是泛型的,<>中的类型,就是局部变量的类型。
使用Set方法来设置局部变量的值,使用Get方法来获取局部变量的值。

有一篇文章对ThreadLocal讲的很好 : http://zhangbo-peipei-163-com.iteye.com/blog/20285


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值