ThreadLocal原理是什么

  介绍

这篇文章主要介绍ThreadLocal原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

ThreadLocal即线程局部变量的意思!所以什么是线程局部变量?这玩意有什么鸟用?是不是面试被问到了说不出个一二三?今天就来扒一扒这货的源码,从根本上了解这货是干啥的。

<强>线程,ThreadLocalMap,入口三者关系

其实研究下来他的源码实现,其实也没想象的那么复杂,其最主要有以下几点:

1, Java可以通过Thread.currentThread()来获得当前的线程的实例对象。既然能拿到这线程对象实例,那么我们就可以操作该实例(的属性),比如为该线程对象设置一个值什么。

2,每一个线程对象都有一个ThradLocalMap实例,该实例有一个一个输入组成的数组,进入对象有两个主要属性:价值和ThreadLocal的弱引用,其中价值这个属性就是值设置给当前线程所持的有,也是ThreadLocal的核心属性:

静态类条目延伸WeakReference

注意项继承自WeakReference引用,其关键就是ThreadLocal对象!(图1)

 ThreadLocal原理是什么

结合1和2两个知识点,我们就可以知道我们拿到线程对象之后,就可以操控当前线程对象的ThreadLocalMap对象,然后把想要保存的价值交给ThreadLocalMap的条目的值属性,线程,ThreadLocalMap,价值三者之间的关系可以用下图表示(图2):

 ThreadLocal原理是什么

通过上图我们可以得出这么一个结论:一个线程对象持有一个ThreadLocalMap对象,然后呢,一个ThreadLoalMap对象又包含了多个ThreadLlocal对象及ThreadLocal对象所在线程的价值! ! !一言以蔽之:一个线程对象可以持有多个ThreadLocal对象的变量值值

那么ThreadLocal和线程又有啥关系呢?二者是怎能对值进行读取的呢?下面就根据源码来简单的分析下。

<强> ThreadLocal和线程的关联

先看看ThreadLocal的设置方法:

公共空集(T值){//获取当前线程   线程t=Thread.currentThread ();//获取当前线程持有的ThreadLocalMap   ThreadLocal。ThreadLocalMap地图=getMap (t);//将值设置给threadlocalMap   如果(地图!=null)   地图。集(这个值);   其他的   createMap (t值);   }

设置方法很逻辑很简单(j结合上图2看更好理解):

1,通过currentThread方法拿到当前线程对象

2,获取当前线程对象的ThreadLoalMap对象

3,将价值连同ThreadLocal对象自己组成一个条目对象保存在

ThreadLoalMap的条目类型的数组中。

<强>在来看看ThreadLocal的得到方法:

公共T () {//获取当前线程   线程t=Thread.currentThread ();//获取当前线程的ThreadLocalMap对象   ThreadLocalMap地图=getMap (t);   如果(地图!=null) {//获取与ThreadLocal对象想关联的价值   ThreadLocalMap。输入e=map.getEntry(这个);   如果(e !=null) {   @SuppressWarnings (“unchecked")//获取值=(T) e.value T结果;   返回结果;   }   }//为空返回初始化值   返回setInitialValue ();   }

可以发展得到的整体逻辑也很简单:

1,获取当前线程对象

2,获取当前线程对象的ThreadLocalMap对象

3,从ThreadLocalMap中获取与ThreadLocal相关联的条目对象,具体的就是以ThreadLocal为关键获取。

4,获取步骤3的条目的值属性,并返回之。

通过整体观察获取和设置方法可以得出如下结论:ThreadLocal对象调用集方法就是往线程对象的ThreadLocalMap里面添加值;ThreadLocal对象调用得到方法就是从线程对象的ThreadLocalMap里面获取值。核心就是操纵线程对象的ThreadLocalMap对象进行值的读和写。原理就这么简单。

那么位于不同线程的不同ThreadLocal对象,在其他线程里保存值是一个什么样的关系呢?可以通过下图来清晰的描述出来:

 ThreadLocal原理是什么

<强> ThreadLocal的使用实例

我们在知道在Android中一个线程只有一个电影对象,那么是怎么做到的呢?就是ThreadLocal发挥了作用,看看电影的制备方法:

ThreadLocal原理是什么