ThreadLocal 是 Java 提供的一个用于创建线程局部变量的类。这些变量不同于它们的正常变量,因为每一个线程都会拥有这个变量的一个独立副本,因此每个线程都可以独立地更改自己的副本,而不会影响其他线程所拥有的副本。
定义
ThreadLocal 是一个泛型类,用于创建线程局部变量。这些变量与正常的可共享变量不同,因为每个访问该变量的线程都有自己独立初始化的变量副本。ThreadLocal 实例通常作为静态字段存在于类中,以允许它们被类的所有实例共享。
作用
ThreadLocal 主要用于在多线程环境中存储线程特有的数据,这样每个线程都可以独立地更改自己的数据副本,而不会影响到其他线程。这在很多情况下非常有用,例如,当你想在多个线程之间保持某种状态时。
使用语法
创建 ThreadLocal 实例
ThreadLocal<String> threadLocal = new ThreadLocal<>();
设置值
对于当前线程,你可以使用 set 方法来设置值。
threadLocal.set("Thread-specific value");
获取值
你可以使用 get 方法来获取当前线程的值。
String value = threadLocal.get();
移除值
使用完线程局部变量后,最好使用 remove 方法来移除它,以释放资源。
threadLocal.remove();
使用语法实例
下面是一个简单的例子,展示了如何在多线程环境中使用 ThreadLocal:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ThreadLocalExample { // 创建一个 ThreadLocal 实例 private static final ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i < 5; i++) { final int threadNumber = i; executorService.submit(() -> { // 为当前线程设置值 threadLocal.set("Thread " + threadNumber + " specific value"); try { // 模拟一些工作 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 获取并打印当前线程的值 System.out.println(threadLocal.get()); // 移除值 threadLocal.remove(); }); } executorService.shutdown(); }
}