ThreadLocal详解

本文详细解析了ThreadLocal在Spring管理事务时的作用,包括如何通过AopContext获取当前代理类引用以确保方法事务生效,以及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进行存储当前线程需要的数据了。

 

转载于:https://www.cnblogs.com/ruiding/p/4231351.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值