在登录时存入值,在取的时候有时有,有时为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);
}
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())
Map map = (Map) threadLocal.get();
map是null怎么回事?刚登录完取就有,多取几次就为null了……
每个线程持有一个本地副本对象你是WEB程序吗?
那ThreadLocal明显不适合你的应用场景
WEB中,每次都请求可能处于不同的线程中被执行,所以你在请求时访问一个ThreadLocal不能保证本地副本是上一次请求的,WEB中更应该使用session来达到辨认用户的目的
1)如果是web程序中必须在同一个request中使用才可以认为是在同一个线程里面,这样放入的map才可以在同一个线程中取到。
2)放入ThreadLocal中的实例,在ThreadLocal中保持的是弱引用,如果没有直接的强引用关联到实例,java的垃圾回收机制是允许将这块内存回收的。具体关于弱引用的内容可以参考JDK中的WeakReference,有比较详细的说明。