ThreadLocal主要提供了保持对象的方法和避免参数传递的方便的对象访问方式
ThreadLocal的应用场合,最适合的是按线程多实例(每个线程对应一个实例)的对象的访问
1.每一个线程都有一个ThreadLocalMap类对象,可以将线程自己的对象保持在其中,各管各的,这样线程就可以正确的访问到自己的对象
2.将一个公共的ThreadLocal静态实例作为KEY,将不同对象的引用保存在不同线程的ThreadLocalMap中,然后在线程的各处通过这个静态ThraedLocal实例的get()方法获取到自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦
3.如果要把本来线程共享的对象通过ThreadLocal.set()放到线程中也可以,可以实现避免参数传递的访问方式,但是要注意get()到的是那同一个共享对象,并发访问问题要靠其他手段来解决。但一般来说线程共享的对象通过设置为某类的静态变量就可以实现方便的访问了
ThreadLocal应用
private static final ThreadLocal threadSession = new ThreadLocal(); public static Session getSession() throws InfrastructureException { Session s = (Session) threadSession.get(); try { if (s == null) { s = getSessionFactory().openSession(); threadSession.set(s); } } catch (HibernateException ex) { throw new InfrastructureException(ex); } return s; }
如果大家不懂可以查JDK,查看实现原理