第一次发技术博---从ThreadLocal看Map
在Hibernate Session 管理方案中, ThreadLocal这个类得到了大量使用。ThreadLocal这个类为Java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。首先,我们需要知道,SessionFactory负责创建Session,SessionFactory是线程安全的,多个并发线程可以同时访问一个SessionFactory 并从中获取Session 实例。而Session并非线程安全,也就是说,如果多个线程同时使用一个Session实例进行数据存取,则将会导致Session 数据存取逻辑混乱。下面看看利用ThreadLocal管理Session的大众代码:
1 static { 2 sessionFactory = new Configuration().configure().buildSessionFactory();} 3 4 private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 5 6 public static Session getCurrentSession() { 7 return threadLocal.get(); 8 9 } 10 public static Session openSession() { 11 Session session =sessionFactory.openSession(); 12 threadLocal.set(session); 13 return session; 14 }
这样,我们就可以轻易地用ThreadLocal管理Session,估计这个方法懂的人很多。
但我一开始没那么高级,用了Map跟Thread来对Session管理,代码如下:
1 private static Map<Thread, Session> sessionMap = new Hashtable<Thread, Session>(); 2 3 public static Session getCurrentSession() { 4 Session session = sessionMap.get(Thread.currentThread()); 5 if (session == null) { 6 session = sessionFactory.openSession(); 7 sessionMap.put(Thread.currentThread(), session); 8 } 9 return session; 10 }
这样,虽然没有用ThreadLocal方便,但也是一种方案!
后来,小弟改用ThreadLocal,听一个朋友说,其实ThreadLocal的实现,也是用Map来实现的!
接着,我大概看了一下ThreadLocal的源码,还真是用了一个叫ThreadLocalMap,源码:
1 private T setInitialValue() { 2 T value = initialValue(); 3 Thread t = Thread.currentThread(); 4 ThreadLocalMap map = getMap(t); 5 if (map != null) 6 map.set(this, value); 7 else 8 createMap(t, value); 9 return value; 10 }
而这个ThreadLoaclMap里面一个内部类,中间还有很多复杂的设置,这个小弟就不说了,当然我水平没到家,也不会说!
第一次发博,文章有点粗糙~~~期待下次的进化!!!