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

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

  • 相关阅读:
    ContextMenustrip 控件
    Toolstrip 工具栏控件
    Menustrip控件和ContextMenustrip控件
    TabControl 选项卡控件
    GroupBox 分组框控件
    Pnel控件
    【bzoj3427】Poi2013 Bytecomputer dp
    【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp
    【bzoj1334】[Baltic2008]Elect 背包dp
    【bzoj1369】[Baltic2003]Gem 树形dp
  • 原文地址:https://www.cnblogs.com/ForeVerWater/p/2789613.html
Copyright © 2011-2022 走看看