我在看过ThreadLocal的源码后发现该类其实就是以当前线程类Thread.currentThread()来当作一个Map的key去存储当前线程的线程局部变量副本。
既然是以当前线程类当作Map的Key,那不就是只能存储一个当前线程的线程局部变量副本,如果再存储的话就会把前面的覆盖掉?
不知道我这样理解是否正确?
例如:
ThreadLocal threadlocal1 = new ThreadLocal();
ThreadLocal threadlocal2 = new ThreadLocal();
threadlocal1和threadlocal2在同一线程当中,也就是说它们用来存储线程局部变量副本的Map的Key是同一个类。
(1)threadlocal1.set("value1");
(2)threadlocal2.set("value2");
两次把不同的值存入同一个Key的Map当中,也就是说(2)存入的数据会覆盖(1)存入的数据。
threadlocal1.get() = threadlocal2.get() = "value2"。事实是我的理解是错误的,也就是说{threadlocal1.get()="value1"} != {threadlocal2.get() = "value2"}。
这个问题困扰了我一下午,热切希望高手能指点一下。
谢谢,谢谢。

解决方案 »

  1.   

    我想明白了,发现自己其实很笨。
    如果有不明白的请仔细看看ThreadLocal类的源码,其它的不多说了。
      

  2.   

    呵呵!每个Thread 都会保存自己的副本,而且只能在当前线程内使用。
    但是提醒一句:大多数服务器都使用线程池,也就是你下次访问时,很可能拿到上次保存的结果哦,因为你很幸运,你分到了同一个线程!所以,最好在最开始清除那些/初始化那些变量,以免因为莫名其妙的问题。