ThreadLocal用法详解
一、什么是 ThreadLocal?
ThreadLocal
是 Java 提供的一种机制,用于在多线程环境下为每个线程提供独立的变量副本。换句话说,每个线程都有自己独立的变量副本,线程之间互不干扰。
ThreadLocal
本身并不是为了解决并发问题而设计的,而是通过提供线程隔离的方式来避免多线程之间的竞争条件。
简单示例
public class ThreadLocalExample {
private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
public static void main(String[] args) {
Runnable task = () -> {
int value = threadLocal.get();
System.out.println(Thread.currentThread().getName() + " initial value: " + value);
threadLocal.set(value + 1);
System.out.println(Thread.currentThread().getName() + " updated value: " + threadLocal.get());
};
Thread t1 = new Thread(task, "Thread-1");
Thread t2 = new Thread(task, "Thread-2");
t1.start();
t2.start();
}
}
输出:
Thread-1 initial value: 0
Thread-2 initial value: 0
Thread-1 updated value: 1
Thread-2 updated value: 1
从输出可以看到,两个线程的变量是相互独立的,互不干扰。
二、ThreadLocal 的底层原理
1. 核心思想
ThreadLocal
的核心思想是为每个线程维护一个独立的变量副本。具体实现依赖于 Thread
类中的 ThreadLocalMap
。
2. 数据结构
- 每个
Thread
对象都有一个ThreadLocalMap
,它是一个类似于HashMap
的数据结构,但它的键是弱引用(WeakReference
),值是强引用。 ThreadLocalMap
的键是ThreadLocal
实例,值是线程的变量副本。
3. 工作流程
-
当调用
ThreadLocal.get()
时:- 获取当前线程(通过 <