您的位置:首页 > 编程语言 > Java开发

java之ThreadLocal

2016-06-28 16:51 477 查看
java之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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ThreadLocal