ThreadLocal
它提供了一种线程本地变量的机制,使得每个线程都可以拥有自己的变量副本,互相之间不会干扰。
ThreadLocal 的特点是每个线程都有自己的变量副本,线程之间互相独立,互不影响
ThreadLocal 适用于以下场景:
- 线程内部存储全局变量,使得该变量对于线程来说是唯一的
- 管理数据库连接、Session、事务等与线程相关的资源,避免在方法之间传递这些资源
- 为线程提供了一种线程安全的方式存储数据,避免了使用同步机制
ThreadLocal 类提供了以下常用方法:
- set(T value): 设置当前线程的变量值为 value
- get(): 获取当前线程的变量值
- remove(): 移除当前线程的变量值
package com.jdw.java8.thread;
public class ThreadLocalExample {
// 定义一个 ThreadLocal 变量,存储线程私有的数据
private static final ThreadLocal<Integer> threadLocalValue = new ThreadLocal<>();
public static void main(String[] args) {
// 在主线程中设置值
threadLocalValue.set(100);
// 创建两个线程,并分别设置值
Thread thread1 = new Thread(() -> {
threadLocalValue.set(200);
System.out.println("Thread 1: " + threadLocalValue.get()); // 200
});
Thread thread2 = new Thread(() -> {
threadLocalValue.set(300);
System.out.println("Thread 2: " + threadLocalValue.get()); // 300
});
thread1.start();
thread2.start();
// 主线程打印值
System.out.println("Main Thread: " + threadLocalValue.get()); // 100
}
}
我们创建了一个 ThreadLocal 变量 threadLocalValue,并在主线程和两个子线程中分别设置了不同的值。由于每个线程都有自己的 ThreadLocal 变量副本,因此它们互相之间不会干扰。主线程和子线程中的变量值是相互独立的。输出的都是各自线程设置的值!!