ThreadLocal源码混乱

ThreadLocal source code Confusion

public class App 
{
    public static void main( String[] args )
    {
        ThreadLocal<String> threadLocal = new ThreadLocal<String>();
        threadLocal.set("String1");
        threadLocal.set("String2");
        threadLocal.set("String3");

        System.out.println("==============");
        System.out.println("++ " + threadLocal.get());
        System.out.println("++ " + threadLocal.get());
    }
}


the output is 
============= 
++ String3 
++ String3

查看源码中的set方法,对于指定的Thread,它的threadlocalmap只能持有一个map entry?如示例所示,map.set(this, value);这里 "this" 是变量 "threadLocal",所以 "String3" 将覆盖之前的值。 我错了吗?

public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);// here "this" is the var "threadLocal"
        else
            createMap(t, value);
    }

ThreadLocal 是当前线程的局部member/variable;所以每个线程都得到一个值。

同时对设置值的类型没有限制,在您的示例中,您将其设置为字符串,同样这可以是 class、集合的实例。

当您希望代码中的所有值都可用时,请将它们放在一个集合(列表)中,或者将它们放在一个自定义类型中以收集您想要的所有值。

ThreadLocal 从线程映射到值。当从同一个线程询问时 - 所以使用相同的键 - 返回的值当然是相同的。

这就是 ThreadLocal 的目的:始终向线程传递相同的值。