ThreadLocal原理分析

从Java官方文档中的描述:ThreadLoacl类用来提供线程内部得局部变量,这种局部变量在多线程得环境下访问时(通过get()
和set()方法)能够保证各个线程得变量相对对立于其他线程内得变量。ThreadLocal实例通常来说都是private
static类型的,用于关联线程和线程得上下文。

ThreadLoacl的主要作用就是将数据放入到当前的线程对象中的Map里,这个Map是Thread类的实例变量。类ThreadLoacl自己不管理,不存储任何数据,她只是数据和Map之间的桥梁,用于将数据放入到map中。执行后每个线程中的Map存有自己的数据,Map中的key存储的是ThreadLoacl对象,value 存储的就是值,每个Thread中的Map值只对当前线程可见,当前线程销毁,map随之销毁,Map中的数据没有被引用,没有被使用,则随时被GC收回。

ThreadLoacl的作用是:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的声明周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。

简单得就是说,一个Threadlocal在一个线程中是共享的,在不同的线程之间又是隔离的(每个线程都只能看到自己的线程值)

简单的例子如下图所示:

ThreadLocal原理分析_第1张图片
ThreadLocal原理分析_第2张图片
在这里插入图片描述

ThreadLocal 底层代码,如下图
ThreadLocal原理分析_第3张图片
ThreadLocal核心作用:实现线程范围的局部变量

ThreadLocal的原理分析

每个Thread 对象都有一个ThreadLocalMap. 当创建Threadlocal 的时候,就会将该Threadlocal 对象加到Map中,其中键就是Threadlocal ,值可以是任意类型。

向Threadlocal 存入一个值,实际上是向当前线程对象中ThreadlocalMap存入值,ThreadlocalMap我们可以简单理解成为一个Map,而向这个Map存值得key,就是Threadlocal本身。
ThreadLocal原理分析_第4张图片
也就是说想,想存入的Threadlocal中得数据实际上并没有存入到Threadlocal对象中,而是以这个Threadlocal实例作为key存到了当前线程中得一个Map中去了,获取ThreadLocal的值时同样也是这个道理。这也就是为什么ThreadLocal可以实现线程之间隔离的原因了

总结

ThreadLocal得作用:实现线程范围内的局部变量,即ThreadLocal在一个线程中是共享的,在不同线程之间是隔离的。
ThreadLocal的原理:ThreadLocal存入值时使用当前ThreadLocal实例作为key,存入当前线程对象中的Map中去。

你可能感兴趣的:(Java,java,面试,开发语言)