java之ThreadLocal
2016-06-28 16:51
477 查看
java之ThreadLocal
1.ThreadLocal、Thread
(不同版本的jdk实现不同)
ThreadLocal关键代码:
Thread关键代码:
2.hibernate中典型的ThreadLocal的应用:
在getSession()方法中,首先判断当前线程中有没有放进去session,
如果还没有,那么通过sessionFactory().openSession()来创建一个session,再将session set到线程中,
实际是放到当前线程的ThreadLocalMap这个map中,
对于这个session的唯一引用就是当前线程中的那个ThreadLocalMap,
要取得这个session可以通过threadSession.get()来得到,
里面执行的操作实际是先取得当前线程中的ThreadLocalMap,然后将threadSession作为key将对应的值取出。
老版本的jdk定义一个静态的map,将当前thread作为key,创建的session作为值,put到map中;
ThreadLocal的实现是,每个线程中有一个map,而将ThreadLocal实例作为key,线程销毁时相应的东西也一起销毁了,
参考:http://www.iteye.com/topic/103804
[Spring事务传播那块联系到的ThreadLocal]
1.ThreadLocal、Thread
(不同版本的jdk实现不同)
ThreadLocal关键代码:
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); //getMap(t) = return t.threadLocals;(ThreadLocalMap) if (map != null) map.set(this, value); else createMap(t, value); } public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) return (T)map.get(this); T value = initialValue(); createMap(t, value); return value; } static class ThreadLocalMap { ........ }
Thread关键代码:
public class Thread implements Runnable { ...... ThreadLocal.ThreadLocalMap threadLocals = null; ...... }
2.hibernate中典型的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; }
在getSession()方法中,首先判断当前线程中有没有放进去session,
如果还没有,那么通过sessionFactory().openSession()来创建一个session,再将session set到线程中,
实际是放到当前线程的ThreadLocalMap这个map中,
对于这个session的唯一引用就是当前线程中的那个ThreadLocalMap,
要取得这个session可以通过threadSession.get()来得到,
里面执行的操作实际是先取得当前线程中的ThreadLocalMap,然后将threadSession作为key将对应的值取出。
老版本的jdk定义一个静态的map,将当前thread作为key,创建的session作为值,put到map中;
ThreadLocal的实现是,每个线程中有一个map,而将ThreadLocal实例作为key,线程销毁时相应的东西也一起销毁了,
参考:http://www.iteye.com/topic/103804
[Spring事务传播那块联系到的ThreadLocal]
相关文章推荐
- Spring和ThreadLocal
- 深入解析Java中ThreadLocal线程类的作用和用法
- 简单分析Java线程编程中ThreadLocal类的使用
- 实例讲解Java并发编程之ThreadLocal类
- Java多线程编程之ThreadLocal线程范围内的共享变量
- Java多线程编程中ThreadLocal类的用法及深入
- Java 中ThreadLocal类详解
- Android消息机制中Handler切换线程的思考记录
- ThreadLocal详解
- Java多线程编程中ThreadLocal类的用法及深入
- Python 8.3 ThreadLocal
- Struts2中TreadLocal设计模式详解
- Java并发编程:深入剖析ThreadLocal
- 利于ThreadLocal管理Hibernate Session
- 项目问题总结一、全局变量引起的并发问题
- ThreadLocal真会内存泄露?
- ThreadLocal源码笔记
- Java中多线程并发处理方式
- 正确理解ThreadLocal
- java的ThreadLocal简介和示例