ThreadLocal详解(图文结合)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、ThreadLocal是什么?
  • 二、主要特点和用途
    • 1、代码展示
    • 2、Thread、ThreadLocal、ThreadLocalMap的对应关系
      • 2.1文字版
      • 2.2插图版
  • 三、总结


前言

提示:这里可以添加本文要记录的大概内容:

本文将从ThreadLocal的概念、用途以及Thread、ThreadLocal、ThreadLocalMap的对应关系进行阐述。


提示:以下是本篇文章正文内容,下面案例可供参考

一、ThreadLocal是什么?

ThreadLocal 是 Java 中的一个类,用于提供线程本地变量。它允许你创建的变量在每个线程中都有独立的副本,互不干扰。每个线程都可以独立修改自己的副本,而不会影响其他线程的副本。

在 Java 中,线程共享数据是一种非常常见的情况。然而,在某些情况下,你可能希望每个线程都拥有自己独立的变量副本,而不与其他线程共享。这时,ThreadLocal 就能派上用场。

二、主要特点和用途

  1. 每个线程有自己的副本: ThreadLocal 允许你创建的变量在每个线程中都有独立的副本。线程之间互不干扰。
  2. 线程本地存储: ThreadLocal 提供了一种线程本地存储的机制,用于存储和访问每个线程的独立变量。
  3. 使用场景: 主要用于线程封闭(Thread confinement)的情景,其中数据只能被分配给创建它的线程,不会被其他线程访问。
  4. 避免同步问题: 由于每个线程都有自己的副本,通常无需进行同步操作,避免了线程安全性问题。
  5. 实现线程局部模式: ThreadLocal 可以用于实现线程局部模式,其中对象在整个应用程序中全局可用,但其状态是每个线程独立维护的。

1、代码展示

代码如下(示例):

public class Example {
    private static final ThreadLocal<String> threadLocal1 = new ThreadLocal<>();
    private static final ThreadLocal<String> threadLocal2 = new ThreadLocal<>();

    public static void main(String[] args) throws InterruptedException {
        // 在线程1中设置ThreadLocal的值
        Thread thread1 = new Thread(() -> {
            threadLocal1.set("threadLocal1's Value for thread1");
            // 在这个线程中可以通过threadLocal.get()获取到对应的值
            System.out.println(threadLocal1.get());
            threadLocal2.set("threadLocal2's Value for thread1");
            // 在这个线程中可以通过threadLocal.get()获取到对应的值
            System.out.println(threadLocal2.get());
        });

        // 在线程2中设置ThreadLocal的值
        Thread thread2 = new Thread(() -> {
            threadLocal1.set("threadLocal1's Value for thread2");
            // 在这个线程中可以通过threadLocal.get()获取到对应的值
            System.out.println(threadLocal1.get());
            threadLocal2.set("threadLocal2's Value for thread2");
            // 在这个线程中可以通过threadLocal.get()获取到对应的值
            System.out.println(threadLocal2.get());
        });
        thread1.start();
        Thread.sleep(3000);
        thread2.start();
    }
}

结果展示
显而易见:
ThreadLocal详解(图文结合)_第1张图片

2、Thread、ThreadLocal、ThreadLocalMap的对应关系

2.1文字版

当一个线程想要在 ThreadLocal 中保存多个值时是不可行的,因为会被覆盖。解决方式是创建多个 ThreadLocal 对象,并将它们分别保存在该线程的 ThreadLocalMap 中。

具体的关系为:

  • 一个 Thread 对应一个 ThreadLocalMap
  • 一个 ThreadLocalMap 可以保存多个不同的 ThreadLocal 对象及其对应的值。
  • 同时,一个 ThreadLocal 对象可能被多个 ThreadLocalMap 引用,因为多个 ThreadLocal 对象可能在不同的线程中同时使用。

2.2插图版

强调一点:在图中,一个ThreadLocal对象是两个ThreadLocalMap引用的,所以一个ThreadLocal对象可以保存多个线程的值的原理就是他们存储在了不同的ThreadLocalMap中(也就是不同的线程中)。

三、总结

以上就是今天要讲的内容,若是有不对的地方请大家及时指出,希望大家共同学习、进步。有想法的可以去看看源码,但是一定要捋清楚Thread、ThreadLocal、ThreadLocalMap的对应关系。

你可能感兴趣的:(java)