这篇文章主要介绍ThreadLocal原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
ThreadLocal即线程局部变量的意思!所以什么是线程局部变量?这玩意有什么鸟用?是不是面试被问到了说不出个一二三?今天就来扒一扒这货的源码,从根本上了解这货是干啥的。
<强>线程,ThreadLocalMap,入口三者关系强>
其实研究下来他的源码实现,其实也没想象的那么复杂,其最主要有以下几点:
1, Java可以通过Thread.currentThread()来获得当前的线程的实例对象。既然能拿到这线程对象实例,那么我们就可以操作该实例(的属性),比如为该线程对象设置一个值什么。
2,每一个线程对象都有一个ThradLocalMap实例,该实例有一个一个输入组成的数组,进入对象有两个主要属性:价值和ThreadLocal的弱引用,其中价值这个属性就是值设置给当前线程所持的有,也是ThreadLocal的核心属性:
静态类条目延伸WeakReference注意项继承自WeakReference引用,其关键就是ThreadLocal对象!(图1)
结合1和2两个知识点,我们就可以知道我们拿到线程对象之后,就可以操控当前线程对象的ThreadLocalMap对象,然后把想要保存的价值交给ThreadLocalMap的条目的值属性,线程,ThreadLocalMap,价值三者之间的关系可以用下图表示(图2):
通过上图我们可以得出这么一个结论:一个线程对象持有一个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的使用实例强>
我们在知道在Android中一个线程只有一个电影对象,那么是怎么做到的呢?就是ThreadLocal发挥了作用,看看电影的制备方法:
ThreadLocal原理是什么