ThreadLocal
是 Java 中用于实现线程局部变量的类。它为每个使用该变量的线程提供独立的副本,因此每个线程都可以独立地改变它自己的副本,而不会影响其他线程的副本。这对于需要在线程之间保持独立状态的数据非常有用,例如用户会话、数据库连接等。
主要方法
ThreadLocal<T>
构造方法:创建一个线程局部变量。get()
:返回当前线程对应的线程局部变量的值。set(T value)
:设置当前线程对应的线程局部变量的值。remove()
:移除当前线程对应的线程局部变量的值,避免内存泄漏。
使用场景
ThreadLocal
常用于以下场景:
- 线程安全的对象共享:每个线程有自己独立的对象实例,避免了使用同步机制。
- 数据库连接、会话管理:确保每个线程有自己的数据库连接或会话。
示例代码
以下是一个简单的示例,展示了如何使用 ThreadLocal
:
public class ThreadLocalDemo {
// 创建一个 ThreadLocal 变量,用于存储每个线程的独立变量
private static ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
// 获取当前线程的局部变量值
int value = threadLocalValue.get();
System.out.println(Thread.currentThread().getName() + " initial value: " + value);
// 设置新的值
threadLocalValue.set(value + 1);
System.out.println(Thread.currentThread().getName() + " new value: " + threadLocalValue.get());
}
// 移除线程局部变量,防止内存泄漏
threadLocalValue.remove();
};
Thread thread1 = new Thread(task, "Thread-1");
Thread thread2 = new Thread(task, "Thread-2");
thread1.start();
thread2.start();
}
}
输出示例
Thread-1 initial value: 0
Thread-1 new value: 1
Thread-1 initial value: 1
Thread-1 new value: 2
Thread-1 initial value: 2
Thread-1 new value: 3
Thread-1 initial value: 3
Thread-1 new value: 4
Thread-1 initial value: 4
Thread-1 new value: 5
Thread-2 initial value: 0
Thread-2 new value: 1
Thread-2 initial value: 1
Thread-2 new value: 2
Thread-2 initial value: 2
Thread-2 new value: 3
Thread-2 initial value: 3
Thread-2 new value: 4
Thread-2 initial value: 4
Thread-2 new value: 5
在这个示例中,每个线程都有自己独立的 ThreadLocal
变量值,它们不会互相影响。每个线程都从初始值 0 开始,并在每次循环中递增其值。通过使用 ThreadLocal
,确保了线程间的数据隔离,避免了并发问题。