ThreadLocal
是 Java 中一个用于创建线程局部变量的类。线程局部变量是指,对于同一个静态变量,每个线程都有其自己的独立副本,互不影响。ThreadLocal
实例通常被声明为 private static
,并由多个线程共享访问。
以下是 ThreadLocal
的主要方法:
void set(T value)
: 设置当前线程的线程局部变量的值。T get()
: 返回当前线程的线程局部变量的值。void remove()
: 移除当前线程的线程局部变量。使用场景:
线程安全的对象传递: 可以在多线程环境下安全地传递对象,每个线程都持有一个独立的对象。
避免传递参数: 可以避免在方法之间频繁传递相同的参数。
实现线程范围内的单例: 在某些情况下,希望某个类在每个线程中都有一个唯一的实例,可以使用 ThreadLocal
来实现。
下面是一个简单的示例,演示了如何在多线程环境中使用 ThreadLocal
:
public class ThreadLocalExample {
// 使用ThreadLocal创建线程局部变量
private static final ThreadLocal<String> threadLocalVariable = new ThreadLocal<>();
public static void main(String[] args) {
// 创建并启动两个线程
Thread thread1 = new Thread(() -> {
threadLocalVariable.set("Thread 1 Local Variable");
printThreadLocalVariable();
});
Thread thread2 = new Thread(() -> {
threadLocalVariable.set("Thread 2 Local Variable");
printThreadLocalVariable();
});
thread1.start();
thread2.start();
}
private static void printThreadLocalVariable() {
// 从当前线程的ThreadLocal中获取值
System.out.println(Thread.currentThread().getName() + ": " + threadLocalVariable.get());
// 清除ThreadLocal中的值(可选)
threadLocalVariable.remove();
}
}
在这个例子中,ThreadLocal
实例 threadLocalVariable
存储了一个字符串,每个线程设置和获取这个值。因为每个线程都有自己的 threadLocalVariable
副本,所以它们互不影响。