持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
一 前言
用Java语言开发的人对ThreadLocal应该都不会陌生,这个类的使用场景很多,特别是在多线程场景写或在一些框架中会经常用到,使用这个类可以很简洁地编写出优美的多线程程序,那它是如何设计的,我们通过阅读源码一探究竟吧。
二 初识ThreadLocal
2.1 基础定义
官方文档定义:该类提供线程局部变量。 这些变量与其正常的对应方式不同,因为访问一个线程(通过其@code get或@code set方法)的每个线程都有自己的独立初始化变量副本。
通俗来讲就是:线程本地变量,线程独有的变量,作用域为当前线程,别的线程无法访问。
2.2 引入版本
ThreadLocal源码中我们不难看到,其实是早在Java1.2推出之时就被引入的一个支持。
整体代码不多,几百行。
2.3 变量及函数
ThreadLocal主要变量及函数如下图所示:
主要方法有get()、set()、remove()、initialValue()等及ThreadLocalMap,后边章节详说。
2.4 使用示例
public class ThreadLocalTest {
public static void main(String[] args) {
ThreadLocal<String> threadLocalOne = new ThreadLocal<>();
ThreadLocal<String> threadLocalTwo = new ThreadLocal<>();
new Thread(new Runnable() {
@Override
public void run() {
threadLocalOne.set("线程一的数据 --- threadLocalOne");
threadLocalTwo.set("线程一的数据 --- threadLocalTwo");
System.out.println(threadLocalOne.get());
System.out.println(threadLocalTwo.get());
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
threadLocalOne.set("线程二的数据 --- threadLocalOne");
threadLocalTwo.set("线程二的数据 -- threadLocalTwo");
System.out.println(threadLocalOne.get());
System.out.println(threadLocalTwo.get());
}
}).start();
}
}
一般来说,我们在主存(或工作线程)创建一个变量,在子线程中修改了该变量数据,子线程结束的时候,会将修改的数据同步到主存的该变量上。但是,在此处,可以发现,两个线程都是用同一个变量,但是在线程一里面设置的数据,完全没影响到线程二。
运行结果
线程一的数据 --- threadLocalOne
线程一的数据 --- threadLocalTwo
线程二的数据 --- threadLocalOne
线程二的数据 -- threadLocalTwo