为什么ThreadLocal 有时可能get()得到对象的值有时可以有时不行

fj_lyw 2005-06-08 10:45:38
package com.emetacenter.sysadmin;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class LogContext {
public static final int ACTION_LOGIN = 1;
public static final int ACTION_RESOURCE_ADD = 2;
public static final int ACTION_RESOURCE_MODIFY = 3;
public static final int ACTION_RESOURCE_PUBLISH = 4;
public static final int ACTION_RESOURCE_CHECKOUT = 5;
public static final int ACTION_RESOURCE_REMOVE = 6;
public static final int ACTION_RESOURCE_EXPORT = 7;

public LogContext() {
}

//线程共享变量
//根据线程保存日志信息,每一线程保存各自的日志信息,不同线程中的日志信息除会话ID外可能相同。
private static final ThreadLocal _log = new ThreadLocal();

public static void setLog(Log log) {
_log.set(log);
}

//提取参数集合对象
public static Log getLog() {

Log log = new Log();
if (_log.get() != null) {
Log _l = (Log) _log.get();
log.setUserID(_l.getUserID());
log.setUserName(_l.getUserName());
log.setIpAddress(_l.getIpAddress());
}
return log;
}

}

我在 登陆Servlet中已经set进对象的了

Log log = new Log();
log.setUserID(userID);
log.setUserName(user.getUserName());
log.setIpAddress(request.getRemoteAddr());
LogContext.setLog(log);

请大家帮忙兄弟解决急用啊
...全文
631 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Area007 2021-07-23
  • 打赏
  • 举报
回复

ThreadLocal不是弱引用吗?弱引用随时都会被垃圾回收的时候回收 假如我对ThreadLocal set设置完了 这时候垃圾回收了 我们感知不到 然后我们去get了 这不就拿不到我们之前存的值了吗

Acylas 2005-06-08
  • 打赏
  • 举报
回复
试试改一下下面的方法
public static Log getLog() {
Log log = (Log)_log.get();
Log ll = new Log();
if (log != null) {
ll.setUserID(log .getUserID());
ll.setUserName(log .getUserName());
ll.setIpAddress(log .getIpAddress());
}
_log.set(log);
return ll;
}
fj_lyw 2005-06-08
  • 打赏
  • 举报
回复
有时候我get()回来的对象里边的属性值是存在的和set()进去的是一样可有时get()出来的对象的属性为空了
laughsmile 2005-06-08
  • 打赏
  • 举报
回复
//还要修改setLog,getLog
public class LogContext {
//......
public static void setLog(Log log) {
nextLog = log;
_log.set(nextLog);
}
//...
public static Log getLog() {
return _log.get() ;
}
}
laughsmile 2005-06-08
  • 打赏
  • 举报
回复
//ThreadLocal的set方法只能改变被initialValue()方法所赋的值
public class LogContext {
//..........
private static Log nextLog = new Log();
private static ThreadLocal _log = new ThreadLocal() {
protected synchronized Object initialValue() {
return nextLog;
}
};
//..........
}
In355Hz 2005-06-08
  • 打赏
  • 举报
回复
这个和应用服务器的线程池有关,Servlet 规范并没有规定同一个 Session 下访问 Servlet 时总是由一个 Java 线程执行。

一般应用服务器接到 Browse 的连接请求时,是从线程池中任意取出一个空闲线程来响应,这个线程不一定是访问登录 Servlet 时响应的线程,这时候 ThreadLocal 当然取不到内容了。

奇怪,你为什么不用 HttpSession 的 setAttribute/getAttribute 容纳 Log 对象呢?
fj_lyw 2005-06-08
  • 打赏
  • 举报
回复
还是不行啊大哥

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧