JDK的ThreadLocal理解(二.2)原理篇

 

上一遍博客

http://aty.iteye.com/blog/1913734 写道
JDK的ThreadLocal理解(一)使用和测试

 ,对TheadLocal的测试和使用进行了介绍,这一步将介绍一下ThreadLocal的实现原理。

现在附上JDK的ThreadLocal的set方法源码

 

 
public void set(T value) 
{
        //获取当前进入该方法的线程
        Thread t = Thread.currentThread();
       
        //取出当前线程的私有变量map
        ThreadLocalMap map = getMap(t);

        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
}

ThreadLocalMap getMap(Thread t) 
{
        return t.threadLocals;
 }

void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
   }

 

 

t.threadLocals的含义:参考Thread的源代码

 

 /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
 ThreadLocal.ThreadLocalMap threadLocals = null;

 细心阅读Thread源代码会发现:Thread类有1个实例变量,每创建1个线程对象都会拥有自己的成员变量,不存在数据共享问题。

1、细心阅读Thread的源代码就会发现,JDK只是定义(声明)了该变量并赋予初值null,但是不会创建ThreadLocal.ThreadLocalMap对象,这是因为: 创建1个线程的时候,大多数时候我们是不使用这个变量的。所以这样做可以减少不必要的对象创建,减少创建线程的开销

2、ThreadLocal.ThreadLocalMap threadLocals的创建(生成对象)是在ThreadLocal中的。这是因为:ThreadLocal.ThreadLocalMap threadLocals就是为了ThreadLocal服务的,除了ThreadLocal,没有别的地方会需要使用Thread类的这个成员变量。

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值