ThreadLocal的介绍及其使用
private static final ThreadLocal<Integer> THREAD_LOCAL = new ThreadLocal<>();
@Test
void threadLocalTest() {
Assertions.assertDoesNotThrow(() -> {
// 线程1存储数据
Thread t1 = new Thread(() -> {
THREAD_LOCAL.set(10);
log.info("Thread 1 stored data: " + THREAD_LOCAL.get()); // 输出10
// 清除当前线程的数据
THREAD_LOCAL.remove();
});
// 线程2存储数据
Thread t2 = new Thread(() -> {
THREAD_LOCAL.set(20);
log.info("Thread 2 stored data: " + THREAD_LOCAL.get()); // 输出20
// 清除当前线程的数据
THREAD_LOCAL.remove();
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 主线程获取数据
log.info("Main thread data: " + THREAD_LOCAL.get()); // 输出null
// 清除当前线程的数据
THREAD_LOCAL.remove();
});
}
ThreadLocal是Java中的一个线程级别的变量,它提供了一种线程内部的数据共享和访问机制。通过ThreadLocal,每个线程可以独立地存储和获取自己的数据,而不会影响其他线程。
ThreadLocal的用法如下:
- 创建ThreadLocal实例:通过
ThreadLocal<T>
来创建一个ThreadLocal对象,其中T
表示泛型类型,代表要存储的数据类型。 - 存储数据:使用
set(T value)
方法将数据存储到当前线程的ThreadLocal对象中。每个线程都有自己独立的数据副本,互不干扰。 - 获取数据:使用
get()
方法从当前线程的ThreadLocal对象中获取数据。 - 初始化数据:可以通过重写
initialValue()
方法来为ThreadLocal提供初始值。该方法会在第一次调用get()
或set()
时被调用。 - 删除数据:可以使用
remove()
方法来清除当前线程的ThreadLocal对象中的数据。