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);
}
答案 0 :(得分:1)
ThreadLocal是当前线程的本地成员/变量;所以每个线程只获得一个值。
同时对所设置的值的类型没有限制,在您的示例中,您将其设置为String,这可以是类,集合的实例。
当您希望代码中的所有值都可用时,请将它们放在一个集合(列表)中,或者一个自定义类型,它会收集您想要的所有值。
答案 1 :(得分:1)
ThreadLocal
从Thread映射到值。当从相同的线程询问时 - 使用相同的密钥 - 返回的值当然是相同的。
这是ThreadLocal的目的:为线程提供始终相同的值。