首页 > 编程笔记 > Java笔记 阅读:47

Java ThreadLocal用法详解(附带实例)

ThreadLocal 很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal 并不是一个 Thread,而是 Thread 的局部变量。

当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,因此每一个线程都可以独立地改变自己的副本,而不会影响其他线程对应的副本。

ThreadLocal 是由 JDK 包提供的线程本地变量,如果你创建了一个 ThreadLocal 变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。

Java 提供了 3 个用于操作 ThreadLocal 变量的方法,即 set() 方法、get() 方法和 remove() 方法:
【实例】用户线程等待守护线程。创建一个全局的静态 ThreadLocal 变量,存储 String 类型变量;创建两个线程,分别为 threadOne 和 threadTwo:
开启线程 threadOne 和 threadTwo,执行程序,并观察输出结果。代码如下:
public class Demo {
    static ThreadLocal<String> local = new ThreadLocal<>();

    public static void main(String[] args){
        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                local.set("threadOne's local value");
                try {
                    Thread.sleep(5000); // 休眠 5000 毫秒,确保 threadTwo 线程执行 remove()方法
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(local.get());
            }
        });
        Thread threadTwo = new Thread(new Runnable() {
            @Override
            public void run() {
                local.set("threadTwo's local value");
                System.out.println(local.get());
                local.remove();
                System.out.println("local 变量已经执行 remove()方法。");
            }
        });
        threadOne.start();
        threadTwo.start();
    }
}
运行结果为:

threadTwo's local value
local变量已经执行remove()方法。
threadOne's local value

在成功设置 threadOne 线程后,threadOne 线程会进入 5000 毫秒的休眠状态,此时由于只有 threadTwo 线程调用了 remove() 方法,因此将不会影响 threadOne 线程调用 get() 方法进行输出。这体现了 ThreadLocal 变量的显著特性:线程独有数据,其他线程不可侵犯此线程的数据。

相关文章