ThreadLocal用法详解

一、什么是 ThreadLocal?

ThreadLocal 是 Java 提供的一种机制,用于在多线程环境下为每个线程提供独立的变量副本。换句话说,每个线程都有自己独立的变量副本,线程之间互不干扰。

ThreadLocal 本身并不是为了解决并发问题而设计的,而是通过提供线程隔离的方式来避免多线程之间的竞争条件。

    简单示例
    public class ThreadLocalExample {
        private static ThreadLocal threadLocal = ThreadLocal.withInitial(() -> 0);
    
        public static void main(String[] args) {
            Runnable task = () -> {
                int value = threadLocal.get();
                System.out.println(Thread.currentThread().getName() + " initial value: " + value);
                threadLocal.set(value + 1);
                System.out.println(Thread.currentThread().getName() + " updated value: " + threadLocal.get());
            };
    
            Thread t1 = new Thread(task, "Thread-1");
            Thread t2 = new Thread(task, "Thread-2");
    
            t1.start();
            t2.start();
        }
    }
    

    输出:

    Thread-1 initial value: 0
    Thread-2 initial value: 0
    Thread-1 updated value: 1
    Thread-2 updated value: 1
    

    从输出可以看到,两个线程的变量是相互独立的,互不干扰。


    二、ThreadLocal 的底层原理

    1. 核心思想

    ThreadLocal 的核心思想是为每个线程维护一个独立的变量副本。具体实现依赖于 Thread 类中的 ThreadLocalMap

    2. 数据结构
    • 每个 Thread 对象都有一个 ThreadLocalMap,它是一个类似于 HashMap 的数据结构,但它的键是弱引用(WeakReference),值是强引用。
    • ThreadLocalMap 的键是 ThreadLocal 实例,值是线程的变量副本。
    3. 工作流程
    1. 当调用 ThreadLocal.get() 时:

      • 获取当前线程(通过 <

    你可能感兴趣的:(java,jvm,算法)