问题出在你的单例构造函数里了。private static MyThreadLocalData3 instance=null;你把这个申明为static,就是单例模式,那么   if (instance == null)  在第二个线程里是不可能成立的。但 ThreadLocal里的东西在第二个线程里却是在空的,所以  return threadLocal.get();  就返回 null了。

解决方案 »

  1.   

    没看问题回答:在设置和取出的时候都打印下Thread.currentThread就知道是不是同一个线程了
      

  2.   

    threadLocal.set(instance);  是将值绑定到当前线程中, if (instance == null) 是判断一个在所有线程都是单例的变量。threadLocal.get;  是在当前线程中取值。 if (instance == null) 只能判断这个单例变量是否有值,不能判断当前线程是否有值!!!
      

  3.   

    各位前辈,不好意思啊,这几天因为有事出差去了,回复晚了。
    看来是我对threadlocal理解错了,看来threadlocal中的值是与set时的线程绑定的,在其他线程中无法取到值。
    那么这里我又有一个问题,既然说threadlocal又称之为副本,那么两次从threadlocal中取到的值,应该是不同的啊。还有,threadlocal存在的意义是什么?是否仅仅就是不能再其他线程中取到threadlocal管理的变量?
      

  4.   


    前面的几个问题你自己去看一下源代码,仔细理解一下就好了。ThreadLocal 存在的一个重要的原因是在IOC或依赖注入等不方便的时候用于传参