聊聊 ThreadLocal 类(一)

48 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

前言

在多线程的环境下访问共享变量的时候,往往需要采用一定的同步机制来防止出现线程安全问题。往往会采用 synchronized 锁、ReentrantLock 锁等方式对访问共享变量加锁,但是如果使用不恰当容易造成死锁;此外,加锁的方式会一定程度上影响程序的性能。不过,在 Java 中,有一个 ThreadLoacl 类能够实现在创建变量后,每个线程对变量访问时访问的是线程自己的本地变量。

ThreadLocal 是什么

ThreadLocal 是 Java 中一个重要的工具类,它允许开发人员存储线程特定的数据,在多线程环境下更方便维护状态。换句话说,ThreadLocal 可以在每一个线程中存储线程特定的值,并且每个线程只能访问自己的值。

ThreadLocal 有两个重要的方法:set 和 get 。 set 方法用于在当前线程中设置一个值, get 方法用于在当前线程中获取一个值。

ThreadLocal 的简单实例

我们使用 ThreadLocal 保存并打印相关的变量信息,代码如下所示:

package com.zhongger.threadLearn;

/**
 * @author zhongmingyi
 * @date 2023/2/12 10:15 下午
 */
public class ThreadLocalLearn {
    private static ThreadLocal<String> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                threadLocal.set("当前线程1:" + Thread.currentThread().getName());
                System.out.println("线程名称:" + threadLocal.get());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                threadLocal.set("当前线程2:" + Thread.currentThread().getName());
                System.out.println("线程名称:" + threadLocal.get());
            }
        }).start();


    }
}

运行结果如图所示:

image.png

从运行结果中我们可以看出来,在多线程环境下,ThreadLocal 是非常有用的,它可以避免多线程环境下的共享数据问题。 ThreadLocal 确保每个线程只能访问自己的数据,而不会影响其他线程的数据。 那么它是怎么实现的呢?原理又是什么呢?我们且听下回分解!