在登录时存入值,在取的时候有时有,有时为null是怎么回事?也是参照网上的例子看的这是ThreadLocal变量
private static final ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();这是获取
Map map = (Map) threadLocal.get();
if (map != null)
    return map.get(key);
else
    return null;这是存入
Map map = (Map) threadLocal.get();
if (map == null) {
    map = new HashMap();
    map.put(key, value);
    threadLocal.set(map);
}

解决方案 »

  1.   


    if (map != null)判断错了,改为
    if (map != null&&!map.isEmpty())
      

  2.   

    读和取应该放到一起,如果为null的话要生成一个并且放到TreadLocal中
      

  3.   

    问题在这一步
    Map map = (Map) threadLocal.get();
    map是null怎么回事?刚登录完取就有,多取几次就为null了……
      

  4.   

    ThreadLocal用于处理线程相关的数据池
    每个线程持有一个本地副本对象你是WEB程序吗?
    那ThreadLocal明显不适合你的应用场景
    WEB中,每次都请求可能处于不同的线程中被执行,所以你在请求时访问一个ThreadLocal不能保证本地副本是上一次请求的,WEB中更应该使用session来达到辨认用户的目的
      

  5.   

    4楼的讲解是对的,因为在你这个应用中,ThreadLocal 是每一个线程持有一个MAP,如果你这是web 应用的话,有可能出现另外线程,而这个另外的线程是不可能持有你原先赋值的MAP,这样肯定取不到值,你可以自己试着打出存入Map线程的名字,和取Map 线程的名字,对比一下是否是同一个线程。
      

  6.   

    你是在web程序中使用吗?有两种可能性。
    1)如果是web程序中必须在同一个request中使用才可以认为是在同一个线程里面,这样放入的map才可以在同一个线程中取到。
    2)放入ThreadLocal中的实例,在ThreadLocal中保持的是弱引用,如果没有直接的强引用关联到实例,java的垃圾回收机制是允许将这块内存回收的。具体关于弱引用的内容可以参考JDK中的WeakReference,有比较详细的说明。
      

  7.   

    Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).