ThreadLocal线程本地存储详解
在并发编程中,处理共享数据时通常需要同步机制(如synchronized或Lock)来保证线程安全。但 ThreadLocal 提供了另一种思路:让共享数据不再共享,通过为每个线程创建独立的变量副本,实现线程间的数据隔离。
ThreadLocal 核心原理
基本概念
ThreadLocal(线程本地变量)为每个线程维护一个独立的变量副本,线程对副本的修改不会影响其他线程。其核心思想是:
- 空间换时间:通过为每个线程分配独立内存空间,避免线程间的同步开销。
- 数据隔离:每个线程操作自己的副本,消除竞争条件。
实现结构
ThreadLocal 的实现依赖于Thread类和ThreadLocalMap:
Thread 类:每个线程持有两个ThreadLocalMap对象:
1
2ThreadLocal.ThreadLocalMap threadLocals = null; // 线程本地变量
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; // 可继承的本地变量ThreadLocalMap:ThreadLocal 的静态内部类,本质是一个哈希表,key 为 ThreadLocal 对象,value 为线程的变量副本。
ThreadLocal 核心方法
ThreadLocal 通过以下方法操作线程的变量副本:
