当前位置:编程学习 > JAVA >>

ThreadLocal问题

在登录时存入值,在取的时候有时有,有时为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);
}
--------------------编程问答--------------------
if (map != null)判断错了,改为
if (map != null&&!map.isEmpty()) --------------------编程问答-------------------- 读和取应该放到一起,如果为null的话要生成一个并且放到TreadLocal中 --------------------编程问答-------------------- 问题在这一步
Map map = (Map) threadLocal.get();
map是null怎么回事?刚登录完取就有,多取几次就为null了…… --------------------编程问答-------------------- ThreadLocal用于处理线程相关的数据池
每个线程持有一个本地副本对象

你是WEB程序吗?
那ThreadLocal明显不适合你的应用场景
WEB中,每次都请求可能处于不同的线程中被执行,所以你在请求时访问一个ThreadLocal不能保证本地副本是上一次请求的,WEB中更应该使用session来达到辨认用户的目的 --------------------编程问答-------------------- 我觉得楼上说的不对……还有没人比较了解的说说看 --------------------编程问答-------------------- 4楼的讲解是对的,因为在你这个应用中,ThreadLocal 是每一个线程持有一个MAP,如果你这是web 应用的话,有可能出现另外线程,而这个另外的线程是不可能持有你原先赋值的MAP,这样肯定取不到值,你可以自己试着打出存入Map线程的名字,和取Map 线程的名字,对比一下是否是同一个线程。 --------------------编程问答-------------------- 你是在web程序中使用吗?有两种可能性。
1)如果是web程序中必须在同一个request中使用才可以认为是在同一个线程里面,这样放入的map才可以在同一个线程中取到。
2)放入ThreadLocal中的实例,在ThreadLocal中保持的是弱引用,如果没有直接的强引用关联到实例,java的垃圾回收机制是允许将这块内存回收的。具体关于弱引用的内容可以参考JDK中的WeakReference,有比较详细的说明。 --------------------编程问答-------------------- 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). 

补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,