跳至主要內容

ThreadLocal详解

fangzhipeng约 2740 字大约 9 分钟

什么是ThreadLocal

ThreadLocal是线程本地变量,它提供了线程本地变量的支持。每个ThreadLocal对象都维护了一个独立的变量副本,每个线程都可以访问自己的副本,对其他线程而言是隔离的。

  • 使用ThreadLocal,可以为每个线程创建独立的变量副本,每个线程可以通过ThreadLocal对象来获取和设置自己的变量副本,不存在多线程间共享的问题。
  • ThreadLocal 提供了线程本地的变量副本。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。

下图可以增强理解:

image-20240106113729346
image-20240106113729346

ThreadLocal的使用示例

下面是一个简单的示例,演示了如何在多个线程中使用ThreadLocal:

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadLocalExample {

    private static ThreadLocal<AtomicInteger> threadLocal = ThreadLocal.withInitial(AtomicInteger::new);

    public static void main(String[] args) {
        Runnable incrementTask = () -> {
            // 获取当前线程的变量副本
            AtomicInteger value = threadLocal.get();
            // 对变量进行操作
            value.incrementAndGet();
            // 打印当前线程的变量值
            System.out.println(Thread.currentThread().getName() + ": " + value.get());
            // 清除当前线程的变量副本
            threadLocal.r