本帖最后由 fangmingshijie 于 2014-04-02 09:04:52 编辑

解决方案 »

  1.   

    在6之前你没有将name保存到线程的account对象里
      

  2.   

    基本上原因就是ThreadLocal中set的对象只能为本线程所看见,不能被其他线程看见
    对于上面的代码,Account实例化时,成员name.set()的对象只能被main线程取出,而后面的线程甲、乙并不能获取到该Account对象的成员name中set的对象,所以并不会有什么name中存放对象的副本什么的。
      

  3.   

    否则如果能看见这个被set的对象,就意味着甲乙线程能看见这个对象的引用,那么当修改对象时,就不能实现甲乙分别设置了一个name,这与ThreadLocal的设计是违背的。
      

  4.   

    三楼是对的threadlocal奥妙在此
      

  5.   

    ThreadLocal可以理解为一个Map<Thread_ID,Value>,
    实例化Account时相当于
            Map.put(主线程_Id,"初始名");
    线程甲启动后,在循环输出中name.getName相当于 
            return Map.get(线程甲_Id),故返回值为null。
    希望可以帮到你
      

  6.   

    什么情景下使用ThreadLocal比较好?什么情景下使用同步比较好啊?
      

  7.   

    public T get()返回此线程局部变量的当前线程副本中的值。如果变量没有用于当前线程的值,则先将其初始化为调用 initialValue() 方法返回的值。 
    返回此线程局部变量的当前线程的“初始值”。线程第一次使用 get() 方法访问变量时将调用此方法,但如果线程之前调用了 set(T) 方法,则不会对该线程再调用 initialValue 方法。通常,此方法对每个线程最多调用一次,但如果在调用 get() 后又调用了 remove(),则可能再次调用此方法。 
    该实现返回 null;如果程序员希望线程局部变量具有 null 以外的值,则必须为 ThreadLocal 创建子类,并重写此方法。通常将使用匿名内部类完成此操作。 
      

  8.   


    +1创建匿名内部类覆盖它的 initialValue() 方法返回一个默认值就好了,只要你觉得有默认值是设计要求的就可以这么做,多数时候并不需要默认值。