关于"ThreadLocal"的内部设计

About the internal design of "ThreadLocal"

刚刚研究了Java ThreadLocal的源码,有两个问题,希望大家帮帮我!

首先,为什么不直接使用one Map来存储所有值,而不是将map绑定到一个线程?像这样:

public class ThreadLocal<T> {

    private ConcurrentHashMap<Thread, T> threadAndVal = new ConcurrentHashMap<>(); 

    // get value from threadAndVal.... put value to threadAndVal
}

而在方法set(T value)中,我没有看到任何同步策略。这是线程安全的吗?

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);  // ⬅️Why createMap is thread safe?
    }

感谢您的帮助!

为什么不用ConcurrentHashMap

主要原因是性能。使用线程安全映射比使用没有线程安全的自定义映射要慢得多。

第二个原因是只要 ThreadLocal 存在,Map<Thread,T> 就会保留对线程和值的引用,并且它们通常用作静态变量。

第三个有趣的原因是,我可以创建一个 Thread 并覆盖 equalshashCode,它的行为很顽皮。

ThreadLocal.set 是线程安全的吗?

不需要。第一行是:

Thread t = Thread.currentThread();

其他一切都在 Thread t 上完成。所有这些操作只能从那个线程完成。