ThreadLocal 介绍

举报
林欣 发表于 2024/09/15 18:37:52 2024/09/15
【摘要】 ThreadLocal 是 Java 中一个非常有用的类,它提供了一种线程局部变量(thread-local variables)的功能。通过使用 ThreadLocal,每个线程都可以在其内部存储自己的变量副本,并且这些变量对其他线程是不可见的。这样,即使在多线程环境下,也能保证变量的独立性和线程安全。 主要用途线程安全:通过为每个线程提供变量的独立副本,来避免多线程环境下对共享变量的并发...

ThreadLocal 是 Java 中一个非常有用的类,它提供了一种线程局部变量(thread-local variables)的功能。通过使用 ThreadLocal,每个线程都可以在其内部存储自己的变量副本,并且这些变量对其他线程是不可见的。这样,即使在多线程环境下,也能保证变量的独立性和线程安全。

主要用途

  1. 线程安全:通过为每个线程提供变量的独立副本,来避免多线程环境下对共享变量的并发访问冲突。
  2. 传递上下文:可以在不同的方法调用中,传递同一线程的局部变量,而无需通过参数显式传递。

基本用法

  1. 创建 ThreadLocal 实例
    使用 ThreadLocal 的泛型构造函数来创建一个 ThreadLocal 实例,指定该变量所持有的值的类型。

    ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
    
  2. 设置值
    在每个线程中,通过调用 set(T value) 方法来设置当前线程的变量值。

    threadLocal.set(123);
    
  3. 获取值
    在同一线程中,通过调用 get() 方法来获取之前设置的变量值。

    Integer value = threadLocal.get();
    
  4. 移除值
    通过调用 remove() 方法可以移除当前线程的变量值。这样做可以有助于减少内存泄漏,尤其是在使用线程池等场景时。

    threadLocal.remove();
    

注意事项

  • 内存泄漏ThreadLocal 在使用时如果不及时调用 remove() 方法清理不再需要的变量,可能会因为线程的复用(如线程池中的线程)而导致内存泄漏。
  • 线程可见性:每个线程的 ThreadLocal 变量都是独立的,互不可见。
  • 初始值:可以通过 ThreadLocal 的子类或 withInitial(Supplier<? extends S> supplier) 方法来指定一个初始值。

示例

public class ThreadLocalExample {

    private static final ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);

    public static void main(String[] args) {
        // 线程1
        Thread thread1 = new Thread(() -> {
            System.out.println(threadLocal.get()); // 输出0,因为是初始值
            threadLocal.set(1);
            System.out.println(threadLocal.get()); // 输出1
        });

        // 线程2
        Thread thread2 = new Thread(() -> {
            System.out.println(threadLocal.get()); // 输出0,与线程1无关
            threadLocal.set(2);
            System.out.println(threadLocal.get()); // 输出2
        });

        thread1.start();
        thread2.start();
    }
}

在上面的示例中,我们为 ThreadLocal 变量设置了初始值 0,并创建了两个线程。每个线程都设置了自己的 ThreadLocal 变量值,并分别获取和打印它们。尽管这两个线程操作的是同一个 ThreadLocal 变量的引用,但它们各自的变量值是独立的。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。