目录
1. ThreadLocal
2. ThreadLocal使用示例
3. ThreadLocal源码分析
4. 线程池使用ThreadLocal导致的内存泄露案例解析
1. ThreadLocal
ThreadLock是JDK包提供的,它提供了线程本地变量,也就是如果创建了一个ThreadLocal变量,访问这个变量的每个线程都会有这个变量的一个本地副本。
当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个ThreadLock变量后,每个线程都会复制一个变量到自己的本地内存
ThreadLocal
实例通常是类中的private static字段,它们希望将状态与某一个线程(例如,用户ID或事务ID)相关联。
ThreadLocal定义了四个常用方法:
- get() : 返回此线程局部变量的当前线程副本的值
- initialValue(): 返回此线程局部变量的当前线程的"初始值"
- remove(): 移除此线程局部变量当前线程的值
- set(T value): 将此线程局部变量的当前线程副本中的值设置为指定值
除了这四个方法,ThreadLocal内部还有一个静态内部类ThreadLocalMap,该内部类才是实现线程隔离机制的关键,get()、set()、remove()都是基于该内部类操作。ThreadLocalMap提供了一种用键值对方式存储每一个线程的变量副本的方法,key为当前ThreadLocal对象,value则是对应线程的变量副本。
- ThreadLocal实例本身不存储值,它只是提供了一个在当前线程中找到副本值的key
- ThreadLocal包含在Thread中
1. ThreadLocal使用示例
public class ThreadLocalTest {
// print函数
static void print(String str) {
// 1.1 打印当前线程本地内存中的localVariable变量的值
System.out.println(str + ":" + localVariable.get());
// 1.2 清除当前线程本地内存中的localVariable变量
// localVariable.remove();
}
// 创建ThreadLocal变量
private static ThreadLocal<String> localVariable = new ThreadLocal<>();
public static void main(String[] args) {
// 创建线程one
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
// 设置线程one中本地变量的localVariable的值
localVariable.set("threadOne local variable");
// 调用打印函数
print("threadOne");
// 打印本地变量值
System