ThreadLocal 是一个 Java 中非常有用的工具类,可以为每个线程提供一个独立的变量副本,保证了线程安全。
ThreadLocal 实现原理:
每个 ThreadLocal 对象内部都有一个 Map,其中 key 为当前线程,value 为该线程的变量副本。在获取变量值时,ThreadLocal 首先获取当前线程,然后从 Map 中获取该线程的变量副本。
ThreadLocal 使用案例代码:
public class ThreadLocalTest {
private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
threadLocal.set("value1");
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
threadLocal.remove(); // 可以手动调用 remove() 方法来清除当前线程的变量副本
});
Thread thread2 = new Thread(() -> {
threadLocal.set("value2");
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
threadLocal.remove();
});
thread1.start();
thread2.start();
}
}
在上述代码中,我们创建了一个 ThreadLocal 对象,并在两个线程中分别设置不同的变量值。由于每个线程都有自己独立的变量副本,因此输出的结果会分别是 "value1" 和 "value2"。需要注意的是,使用完 ThreadLocal 后应该手动调用 remove() 方法来清除当前线程的变量副本,以避免内存泄漏。