一、ThreadLocal 的理解
ThreadLocal 由 JDK 包提供,它提供了线程本地变量,如果创建了一个 ThreadLocal 变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量的时候,实际上是操作自己本地内存里面的变量,从而避免了线程安全问题。创建了一个 ThreadLocal 变量后,每个线程都会复制一个变量到自己的本地内存中。如图所示:
二、ThreadLocal 的使用示例
代码如下:
public class ThreadLocalTest {
// 创建ThreadLocal变量
public static ThreadLocal<String> localVariable = new ThreadLocal<>();
// 打印方法
public static void print(String str) {
// 打印当前线程本地内存中localVariable变量的值
System.out.println(str + ":" + localVariable.get());
// 清除当前线程本地内存中localVariable变量的值
localVariable.remove();
}
public static void main(String[] args) {
// 创建线程thread1
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 设置线程thread1中本地变量localVariable的值
localVariable.set("thread1 local variable");
print("thread1");
System.out.println("thread1 remove after" + ":" + localVariable.get());
}
});
// 创建线程thread2
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 设置线程thread2中本地变量localVariable的值
localVariable.set("thread2 local variable");
print("thread2");
System.out.println("thread2 remove after" + ":" + localVariable.get());
}
});
// 启动线程
thread1.start();
thread2.start();
}
}
运行结果如下:
thread1:thread1 local variable
thread2:thread2 local variable
thread1 remove after:null
thread2 remove after:null
将 print() 方法中的 localVariable.remove() 注释,再次运行得到运行结果:
thread1:thread1 local variable
thread2:thread2 local variable
thread1 remove after:thread1 local variable
thread2 remove after:thread2 local variable