ThreadLocal和InheritableThreadLocal解析

一、两者区别:

    ThreadLocal:为每一个线程创建一个副本,每个副本线程隔离。但是他不支持继承。

    InheritableThreadLocal:支持继承。这里的继承不是extends,是指线程的继承。也就是说新起一个线程可以拥有老线程的数据。


二、原理:

    这里要先说另一个概念ThreadLocalMap。他和普通map差不多,也是key-value结构,key为threadlocal对象,value为你设置的值。为什么这里要用map,因为可能有多个ThreadLocal对象。所以这个map可以理解为仓库,存储数据的仓库。

    在Thread类我们可以看到如下分别创建2个 ThreadLocalMap对象。用来存储数据。

ThreadLocal和InheritableThreadLocal解析_第1张图片

    继续追踪,查找它是什么时候被赋值的(分为ThreadLocal实现和InheritableThreadLocal实现)。

    ThreadLocal:在ThreadLocal类的set方法,它调用当前线程获取ThreadLocalMap,如果没有就new一个

 ThreadLocal和InheritableThreadLocal解析_第2张图片

    InheritableThreadLocal:重写了getMap和createMap两个方法。    

ThreadLocal和InheritableThreadLocal解析_第3张图片

    OK,我们知道是怎么赋值的,那么InheritableThreadLocal是怎么做到继承(值传递)的呢?

    在Thread的init方法里我们看到如下的赋值语句:


    在初始化时候获取当前线程的inheritableThreadLocals(这是新线程的初始化,但是currentThread获取的还是老线程),把它赋值到新线程的属性里去,这样新线程就有值了。

你可能感兴趣的:(java,软件)