一文搞定ThreadLocal
1 基本使用
1.1 常用方法
方法 | 描述 |
---|---|
ThreadLocal() | 创建ThreadLocal对象 |
pubic void set(T value) | 设置当前线程绑定的局部变量 |
public T get() | 获取当前线程绑定的局部变量 |
public void remove() | 移除当前线程绑定的局部变量 |
1.2 ThreadLocal类与synchronize关键字
Demo案例:
synchronize(Deme.class){
//具体业务逻辑(setter/getter方法)
}
区别::尽管ThreadLocal与synchronize都用于处理多线程并发访问,但是两者处理问题的方法与思路不同。
是 | synchronize | ThreadLocal |
---|---|---|
原理 | 同步机制采用“时间换空间” 的方式 ,只提供了一份变量,让不同的线程排队访问 | ThreadLocal采用“空间换时间”的方式,为每个线程都提供了一份变量的空间,从而实现同时访问而互不相干扰 |
侧重点 | 多个线程之间访问资源的同步性 | 多线程中每个线程之间的数据相互隔离 |
总结:synchronize是线程同步,而ThreadLocal是线程之间独立,互不影响,在多线程并发的场景下可以使用。
2 ThreadLocal源码解析
2.1 JDK8中的源码
ThreadLocal的设计:每个Thread维护一个ThreadLocalMap,这个Hash表的key是TheadLocal实例本身,value才能使真正要存储的值为Object类型。
(1)每个Thread线程内部都有一个Map(ThreadLocalMap),
(2)Map里面存储ThreadLocal对象(key)和线程的变量值(value)
(3)Thread内部的Map是由ThreadLocal维护的,有ThreadLocal负责向Map获取和设置线程的变量值
(4)对于不同的线程,每次获取value值时,别的线程并不能获取到当前线程的value值,形成了value值的隔离,互不相干扰。
优点::
(1)这样设计之后每隔Map存储的Entry数量就会变少,因为之前的存储数量有Thread的数量决定,现在是有ThreadLocal的数量决定。
(2)当Thread销毁之后,对应的ThreadLocalMap也会随之销毁,能较少内存的使用。
还没有评论,来说两句吧...