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