ThreadLocal详解

第一次接触ThreadLocal是在Spring管理事务的时候,两个不同事务的方法间调用,需要使用AopContxt获取当前代理类,这样才能使被调用的方法事务生效。因为spring是使用aop控制事务的,而使用了Aop会根据当前是通过接口发布在spring中还是直接类发布发哦spring采用不同的aop方式:cglib和jdk动态代理,所以要使被调用的方法事务生效,就需要从AopContxt中获取当前代理类的引用。去调用同类中的方法,而不是使用this。而spring会将当前代理类引用保存在ThreadLocal中。
好像说远了,今天是要说一下ThreadLocal的。言归正传。

Thread类:通过代码发现当前Thread中有个变量ThreadLocalMap

1 ThreadLocal.ThreadLocalMap threadLocals = null;

ThreadLocal代码如下:

 1 public T get() {
 2   Thread t = Thread.currentThread();
 3   ThreadLocalMap map =  getMap(t);
 4   if (map != null) {
 5     ThreadLocalMap.Entry e = map.getEntry(this);
 6     if (e != null)
 7     return (T)e.value;
 8   }
 9   return setInitialValue();
10 }
1 ThreadLocalMap getMap(Thread t) {
2     return t.threadLocals;
3 }
1 static class Entry extends WeakReference<ThreadLocal> {
2   /** The value associated with this ThreadLocal. */
3   Object value;
4   Entry(ThreadLocal k, Object v) {
5   super(k);
6   value = v;
7   }
8 }

这个变量是个map,这个Map中的Entry的key是ThreadLocal引用,value是Object,所以当前线程可以保存无数多个ThreadLocal变量,key是这个ThreadLocal的对象引用,value是保存的值。所以啊,在当前线程中就可以声明很多ThreadLocal进行存储当前线程需要的数据了。

 

posted @ 2015-01-18 00:18  马路牙子  阅读(162)  评论(0编辑  收藏  举报