ThreadLocal,ThreadLocalMap 和Thread 的关系

废话不多说,看图!!!

 

从上图我们可以发现Thread中持有一个ThreadLocalMap,这里你可以简单理解为就是持有一个数组,这个数组的元素是Entry类型。Entry的key是ThreadLocal类型的,value是Object类型。也就是一个ThreadLocalMap可以持有多个ThreadLocal。他们是一对多的关系

 

为什么ThreadLocalMap 设计为ThreadLocal 内部类?

源码解释:

/**

  * ThreadLocalMap is a customized hash map suitable only for

  * maintaining thread local values. No operations are exported

  * outside of the ThreadLocal class. The class is package private to

  * allow declaration of fields in class Thread. To help deal with

  * very large and long-lived usages, the hash table entries use

  * WeakReferences for keys. However, since reference queues are not

  * used, stale entries are guaranteed to be removed only when

  * the table starts running out of space.

  */

static class ThreadLocalMap {

    //这里省略其他属性和方法

}

主要说明ThreadLocalMap是一个线程本地的值,他的所有方法都是private的,也就意味着除了ThreadLocal这个类,其他类是不能操作ThreadLocalMap中的任何方法的,这样就可以对其他类是透明的。同时这个类的权限时包级别的,也就意味着只有同一个包下面的类才可以引用ThreadLocalMap这个类,这也是Thread为什么可以应用ThreadLocalMap的原因,因为他们在同一个包下面。

虽然Thread可以引用ThreadLocalMap,但是不能调用任何ThreadLocalMap中的方法。这也就是平时我们都是通过ThreadLocal来获取和设置值。

ThreadLocal<String> local = new ThreadLocal<>();
local.set("hello word");
 public T get() {
 //这里通过获取当前的线程
 Thread t = Thread.currentThread();
 //通过线程来获取ThreadLocalMap ,还记得我们上面说的Thread 里面有一个ThreadLocalMap 属性吗?就是这里用上了
 ThreadLocalMap map = getMap(t);
 if (map != null) {
 ThreadLocalMap.Entry e = map.getEntry(this);
 if (e != null) {
 @SuppressWarnings("unchecked")
 T result = (T)e.value;
 return result;
 }
 }
 return setInitialValue();
 }
 ThreadLocalMap getMap(Thread t) {
 return t.threadLocals;
 }

ThreadLdocalMap 什么时候开始和Thread 进行绑定的呢?

在第一次调用ThreadLocal set(T) 方法的时候开始绑定的,源码如下:

public void set(T value) {
 Thread t = Thread.currentThread();
 ThreadLocalMap map = getMap(t);
 if (map != null)
     map.set(this, value);
 else
     //第一次的时候进来这里,因为ThreadLocalMap 还没和Thread 绑定
     createMap(t, value);
 }
 
//这个时候开始创建一个新的ThreadLocalMap 赋值给Thread 进行绑定
void createMap(Thread t, T firstValue) {
 t.threadLocals = new ThreadLocalMap(this, firstValue);
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值