ThreadLocal源代码混乱

时间:2017-08-18 02:56:06

标签: java multithreading thread-local

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条目中?如示例所示,map.set(this,value);这里“this”是var“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);
    }

2 个答案:

答案 0 :(得分:1)

ThreadLocal是当前线程的本地成员/变量;所以每个线程只获得一个值。

同时对所设置的值的类型没有限制,在您的示例中,您将其设置为String,这可以是类,集合的实例。

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

答案 1 :(得分:1)

ThreadLocal从Thread映射到值。当从相同的线程询问时 - 使用相同的密钥 - 返回的值当然是相同的。

这是ThreadLocal的目的:为线程提供始终相同的值。