ThreadLocal

  • ThreadLocal并不是一个Thread,而是Thread的局部变量(哪个线程存的值,只能由哪个线程取)
  • ThreadLocal为每个线程提供一份单独的存储空间,具有线程隔离效果,不同的线程之间不会相互干扰
  • ThreadLocal常用方法:
    • public void set(T value):设置当前线程的线程局部变量
    • public T get():返回当前线程所对应的线程局部变量的值
    • public void remove():移除当前线程的线程局部变量

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ThreadLocalTest {
private static ThreadLocal<String> local = new ThreadLocal<>();

public static void main(String[] args) {
local.set("Main Message");

// 创建线程
new Thread(new Runnable() {
@Override
public void run() {
local.set("Sub Message");
System.out.println(Thread.currentThread().getName() + " : " + local.get()); // Thread-0 : Sub Message
}
}).start();

System.out.println(Thread.currentThread().getName() + " : " + local.get()); // main : Main Message
}
}

ThreadLocal 能实现全局访问特定信息(比如用户信息)是因为:

  • 线程绑定:**一个HTTP请求由一个线程处理**
  • 线程内共享:同一请求内的所有代码都在同一线程中执行
  • 线程隔离:不同请求的线程互不干扰
  • 简单API:提供 set()、get()、remove() 方法

这种机制使得特定信息可以在线程生命周期内任意位置访问,是Web应用中常见的上下文传递方案