ThreadLocal

ThreadLocal是什么

  • ThreadLocal提供了线程隔离的局部变量,通过get( )和set( )方法操作当前线程对应的变量,而且不会和其他线程冲突,实现了基于线程的数据隔离
  • ThreadLocal这个类提供线程本地的变量。这些变量与一般正常的变量不同,它们在每个线程中都是独立的。ThreadLocal实例最典型的运用就是在类的私有静态变量中定义,并与线程关联

set()方法的原理是什么

set()方法是ThreadLocal的核心逻辑,当使用时主要分三步实现:

  • 获取当前线程
  • 获取ThreadLocalMap对象
  • 如果ThreadLocalMap对象存在,则将当前线程对象作为key,要存储的对象作为value存到map中,如果ThreadLocalMap对象不存在,就调用creatMap()进行创建

ThreadLocalMap是什么

  • ThreadLocalMap是一个定义在ThreadLocal类内部的静态类,里面还定义了一个Entry类作为存储值的地方
  • ThreadLocalMap的key是当前ThreadLocal对象,value是我们要存储的值(对象)
  • 调用creatMap()的时候,就是新建一个ThreadLocalMap对象,同时,ThreadLocalMap在Thread类中作为一个属性存在
  • 每个线程Thread维护了ThreadLocalMap这么一个Map,这个map的key是LocalThread对象本身,value则是要存储的对象

get()方法有什么作用

  • get()方法就是从map中取值的过程

ThreadLocal是如何实现变量的线程隔离的

  • 每个Thread维护着一个ThreadLocalMap的引用
  • ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储,key是ThreadLocal对象,值是传递进来的对象
  • 调用ThreadLocal的get()或set()方法时,实际上就是以ThreadLocal对象为key,在ThreadLocalMap中读写value

ThreadLocal是如何避免内存泄露的

  • 在ThreadLocalMap介绍的时候,我们可以看到,ThreadLocalMap是Thread的一个属性。因此,ThreadLocalMap和Thread的生命周期是一样的
  • 如果没有手动删除对应的ThreadLocal的key,那么就会造成内存泄漏无法回收。尤其在线程池环境下,线程会被不断复用

ThreadLocal如何定义


public class TestThreadLocalContext {

    public static ThreadLocal<T> settleThreadLocal = new ThreadLocal<>();

    public static void set(T value) {
        settleThreadLocal.set(value);
    }

    public static void unset() {
        settleThreadLocal.remove();
    }

    public static T get() {
        return settleThreadLocal.get();
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值