目录
ThreadLocal 的原理
核心原理
示例代码
使用 ThreadLocal 需要注意的问题
1. 内存泄漏
2. 线程池中的问题
3. 初始值
4. 性能开销
5. 父子线程数据传递
最佳实践
总结
ThreadLocal 的原理
ThreadLocal
是 Java 中用于实现线程本地存储的类,它为每个线程提供独立的变量副本,避免了多线程环境下的竞争问题。
核心原理
-
线程隔离:
-
每个线程内部都有一个
ThreadLocalMap
,用于存储线程本地变量。 -
ThreadLocal
作为键,变量副本作为值,存储在当前线程的ThreadLocalMap
中。
-
-
数据结构:
-
ThreadLocalMap
是ThreadLocal
的内部类,类似于HashMap
,但键是ThreadLocal
对象,值是线程本地变量。 -
ThreadLocalMap
使用弱引用(WeakReference)存储键,避免内存泄漏。
-
-
操作机制:
-
set(T value)
:将值存储到当前线程的ThreadLocalMap
中。 -
get()
:从当前线程的ThreadLocalMap
中获取值。 -
remove()
:从当前线程的ThreadLocalMap
中移除值。
-
示例代码
public class ThreadLocalExample {private static final ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);public static void main(String[] args) {Runnable task = () -> {int value = threadLocal.get();threadLocal.set(value + 1);System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());};Thread t1 = new Thread(task, "Thre