ThreadLocal理解

ThreadLocal提供线程内变量隔离,避免多线程冲突。它通过ThreadLocalMap存储线程私有数据,使用弱引用避免内存泄漏。ThreadLocal与Synchronized不同,后者通过线程等待解决冲突,而ThreadLocal牺牲空间换取线程安全。常用于参数传递、Spring事务管理和Mybatis分页等场景,使用时注意及时清理ThreadLocalMap以防止内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、ThreadLocal:

        Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

        ThreadLocal是一个线程内部的存储类可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。用于解决多线程中相同变量的访问冲突问题。

        ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。

2、ThreadLocal和Synchronized:

               ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题,不同的点是:

                1)Synchronized是通过线程等待,牺牲时间来解决访问冲突。

                2)ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。

3、ThreadLocal的底层:

        ThreadLocal底层维护着一个静态内部类ThreadLocalMap,每个Thread中定义了一个变量,threadLocals,类型就是ThreadLocalMap。ThreadLocalMap底层维护了一个Entry类型的数组,我们遍历Map就使用到了Entry<k,v>,Entry中由new的ThreadLocal<?>对象作为key,以存储的值作为value。也就是说Thread底层都维护了一个entry[]的数组tabel。new 的ThreadLocal对象确定再线程维护的数组的下标位置,而这个下标就是value存储的对应位置。Entry是集成WeekReference,且构造中可以将new 的ThreadLocal作为弱引用

         在Thread类中存在一个ThreadLocal.ThreadLocalMap类型的变量,threadLocals,用于储存线程私有资源。

         

ThreadLocal.ThreadLocalMap静态类中维护了一个Entry类型的数组table。用于存储这个Thread线程中所有的独立数据。


4、ThreadLocal的set方法,创建ThreadLocalMap方法:

//set 方法
public void set(T value) {
      //获取当前线程
      Thread t = Thread.currentThread();
      //获取当前线程中的ThreadLocalMap变量,实际存储的数据结构类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值