ThreadLocal到底是什么

Posted by YiBo on November 17, 2020

1. 前记

spring中的bean是线程安全的吗?这篇文章引出并解释了 ThreadLocal

2. 理解Java中的ThreadLocal

2.1 源码

1
2
3
4
5
6
7
8
9
10
11
12
public void set(T value) {
    Thread t = Thread.currentThread(); // 获取当前线程
    ThreadLocalMap map = getMap(t); // 获取t线程的变量threadLocals
    if (map != null)
        map.set(this, value); // 进行赋值
    else
        createMap(t, value);
}

ThreadLocalMap getMap(Thread t) {
    return t.threadLocals;
}

2.2 对象放在那里

java中 线程 - 栈内存 - 堆内存的关系

image-20201117175900060

上图中,每个线程中都有一个私有的栈内存

但是threadlocal不是在栈内存存放,而是在堆内存

2.3 使用 InheritableThreadLocal 共享

可以使用 InheritableThreadLocal 复制父线程的数据

2.4 不会导致内存泄露

ThreadLocalMap 在选择 key 的时候,并不是直接选择ThreadLocal实例,而是ThreadLocal实例的弱引用

2.5 使用场景

  • 实现线程安全

reference

https://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/

https://droidyue.com/blog/2014/12/07/differences-between-stack-and-heap-in-java/