您的位置:首页 > 其它

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等等,这个值在每个线程都是不一样的,也不存在什么线程安全的问题,也不需要线程安全。


举例: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: