ThreadLocal的使用介绍和底层原理解析和开源框架的使用实例

ThreadLocal为每个线程提供独立的变量副本,避免线程间数据交叉。它在Spring中用于事务、请求和locale上下文管理。ThreadLocal内部使用ThreadLocalMap存储副本,可能存在内存泄漏问题,需手动调用remove()清除。
摘要由CSDN通过智能技术生成

ThreadLocal简介

ThreadLocal是一个线程内部的数据存储类,它可以为每个线程提供独立的变量副本,不同线程间的变量无法相互访问和修改。这避免了每个线程都要维护一套独立变量的麻烦,并且也减少了线程之间不必要的数据争用。ThreadLocal适用于这样的场景:每个线程需要有自己单独的实例,而不是共享实例。例如,在 web 应用中,每个请求被一个新的线程处理,每个线程需要有自己的变量实例。

ThreadLocal使用示例

public class ThreadLocalExample {
  // 线程局部变量,每个线程有自己的变量副本
  private ThreadLocal<String> threadLocal = new ThreadLocal<>();
  
  public void set(String value) {
    threadLocal.set(value);
  }
  
  public String get() {
    return threadLocal.get();
  }
}

public class ThreadLocalTest {
  public static void main(String[] args) {
    ThreadLocalExample example = new ThreadLocalExample();
    
    // 线程1设置threadLocal变量
    example.set("Thread1 local variable"); 
    System.out.println("Thread1 get: " + example.get());
    
    // 线程2无法获取线程1设置的threadLocal变量
    Thread thread2 = new Thread() {
      public void run() {
        example.set("Thread2 local variable"); 
        System.out.println("Thread2 get: " + example.get());
      }
    };
    thread2.start();
  }
}
复制代码

运行结果: Thread1 get: Thread1 local variable Thread2 get: Thread2 local variable每个线程获取自己设置的值,并不同线程间互不干扰。

ThreadLocal原理解析

ThreadLocal内部使用ThreadLocalMap来存储每个线程的变量副本。ThreadLocalMap是ThreadLocal的静态内部类,每个线程都有自己的ThreadLocalMap副本。

ThreadLocal中get()方法的实现如下:

public T get() {
  Thread t = Thread.currentThread();
  ThreadLocalMap map = getMap(t);
  if (map != null) {
    ThreadLocalMap.Entry e = map.getEntry(this);
    if (e != null) {
      @SuppressWarnings("unchecked")
      T result = (T)e.value;
      return result;
    }
  }
  return setInitialValue(); 
}
复制代码
  1. 获取当前线程对象
  2. 获取当前线程的ThreadLocalMap(实际上是从当前线程的ThreadLocalMap变量中获取)
  3. 在ThreadLocalMap中获取当前ThreadLocal变量对应的value值
  4. 如果不存在,调用setInitialValue()方法初始化value值,并存储到Th
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值