一文搞定ThreadLocal

悠悠 2023-07-05 10:18 58阅读 0赞

1 基本使用

1.1 常用方法


























方法 描述
ThreadLocal() 创建ThreadLocal对象
pubic void set(T value) 设置当前线程绑定的局部变量
public T get() 获取当前线程绑定的局部变量
public void remove() 移除当前线程绑定的局部变量

1.2 ThreadLocal类与synchronize关键字

Demo案例:

  1. synchronizeDeme.class){
  2. //具体业务逻辑(setter/getter方法)
  3. }

区别::尽管ThreadLocal与synchronize都用于处理多线程并发访问,但是两者处理问题的方法与思路不同。





















synchronize ThreadLocal
原理 同步机制采用“时间换空间” 的方式 ,只提供了一份变量,让不同的线程排队访问 ThreadLocal采用“空间换时间”的方式,为每个线程都提供了一份变量的空间,从而实现同时访问而互不相干扰
侧重点 多个线程之间访问资源的同步性 多线程中每个线程之间的数据相互隔离

总结:synchronize是线程同步,而ThreadLocal是线程之间独立,互不影响,在多线程并发的场景下可以使用。

2 ThreadLocal源码解析

2.1 JDK8中的源码

Alt
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也会随之销毁,能较少内存的使用。

发表评论

表情:
评论列表 (有 0 条评论,58人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Scala

    第一节:概述 为什么学习Scala ? Apache Spark 是专为大规模数据快速实时处理的计算引擎/内存级大数据计算框架。Apache Spark 是由Sca

    相关 ThreadLocal 原理

    当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了。 数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封