ThreadLocal的原理与使用

经过源码解读ThreadLocal类的实现this

 

ThreadLocal类提供了如下几个方法spa

 

  1. get()方法是用来获取ThreadLocal在当前线程中保存的变量副本
  2. set()用来设置当前线程中变量的副本
  3. remove()用来移除当前线程中变量的副本
  4. initialValue()是一个protected方法,通常是用来在使用时进行重写的,它是一个延迟加载方法

首先咱们来看一下ThreadLocal是如何为每一个线程建立一个变量副本的:线程

     第160行,获取当前线程对象实例对象

   第161行,经过当前线程对象实例获取一个ThreadLocalMap,这个map是ThreadLocal类的一个内部静态类,blog

   若是map不为空接着获取map中的entry,继承

这里获取键值对传进去的是  this,而不是当前线程trem

   若是获取成功,则返回valueget

   若是map为空,则调用setInitialValue方法返回value源码

   咱们上面的每一句来仔细分析:it

    首先看一下getMap方法中作了什么?

  

getMap中,是调用当期线程t,返回当前线程t中的一个成员变量threadLocals

那么咱们继续取Thread类中取看一下成员变量threadLocals是什么:

实际上就是一个ThreadLocalMap,这个类型是ThreadLocal类的一个内部类,咱们继续取看ThreadLocalMap的实现:

 

能够看到ThreadLocalMapEntry继承了WeakReference,而且使用ThreadLocal做为键值。

而后再继续看setInitialValue方法的具体实现:

很容易了解,就是若是map不为空,就设置键值对,为空,再建立Map,看一下createMap的实现:

以上源码就能够看出:

首先在每一个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。

初始时,在Thread里面,threadLocals为空,当经过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,而且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。

相关文章
相关标签/搜索