第一次发技术博---从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里面一个内部类,中间还有很多复杂的设置,这个小弟就不说了,当然我水平没到家,也不会说!

第一次发博,文章有点粗糙~~~期待下次的进化!!!

posted @ 2012-11-26 19:15  ForeVer水  阅读(754)  评论(0编辑  收藏  举报