这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战
前言
ThreadLocal这个类的作用,相比还有许多的开发同学并不是很了记得呢,今天我们就来介绍一下ThradLocal的一些基本知识。
ThreadLocal介绍
根据这个类名,我们就能大致明白这个类的作用了,ThreadLocal的作用是提供线程的局部变量,这些变量不是我们平时定义的成员变量,成员变量是线程之间共享的。而ThreadLocal变量是线程之间独有(通过 get 或者 set 方法),独立初始化的变量副本,ThreadLocal的推荐用法通常是在类中作为私有的静态字段,里面存放着与线程状态相关联的数据信息(例如,用户 ID 或事务 ID),可能这里大家看的不是很明白,那么我们使用一个代码例子来说明:
import java.util.concurrent.atomic.AtomicInteger;
// 每个线程获取的都是属于自己的本地ID,与其他线程的ID互不干扰。
public class ThreadId {
// 这个原子整型负责分配下一个线程ID
private static final AtomicInteger nextId = new AtomicInteger(0);
// 这个变量中存放着每个线程的唯一ID,在每个线程中都是不一样的
private static final ThreadLocal<Integer> threadId =
new ThreadLocal<Integer>() {
@Override protected Integer initialValue() {
return nextId.getAndIncrement();
}
};
// 返回当前线程的唯一ID
public static int get() {
return threadId.get();
}
}
只要线程是存活状态并且ThradLocal实例是可以获取的,每个线程都会隐式的持有它的线程本地变量,当线程销毁时,所有的线程本地变量都将垃圾回收(除非存在其他的引用)。
ThreadLocal 方法介绍
了解了ThreadLocal的基本概念后,我们来看一下它的方法介绍,它所定义的方法也十分的简单好上手的:
| 修饰符和返回类型 | 方法和方法说明 |
|---|---|
T | get()返回当前线程所对应的线程局部变量。 |
protected T | initialValue() 返回该线程变量的初始值 |
void | remove() 将当前线程的局部变量删除。 |
void | set(T value) 设置当前线程局部变量的值。 |
static <S> ThreadLocal<S> | withInitial(Supplier<? extends S> supplier)创建线程局部变量实例,指定初始值。 |
ThreadLocal 基本原理
我们现在就来探究一下ThreadLocal的基本原理,我们可以把它想象成有一个内部的Map,存放着以Thr线程的唯一标识符作为Key值,然后我们对应的线程的局部变量对应的Value值。
结论
今天我们对ThreadLocal类进行了简单的入门了,希望不了解的开发同学,可以在自己尝试使用一下。