private static final对象也被回收了?

lujun0108 2011-07-13 03:01:57
首先看代码:

/**
* 这个对象存储了在线的终端的信息。这个对象是线程安全的 ,你可以在多线程中使用它。
* 向这个对象中添加或者是移除在线终端的信息,将会直接影响到数据库中存储的终端在线状态。当然,也会最终影响到作业监管平台上面的终端在线情况监控。<br>
* 需要注意的是:如果你要在循环的过程中调用这个对象的remove方法,那么调用之后应该立即退出循环,否则将会引发{@linkplain java.util.
* ConcurrentModificationException}。
* 引起这个异常的原因是由于集合内部的计数器不一致导致的,详细的关于这个问题的介绍请参见联机帮助。
*
* @author LuJun
* @version 2011-04-07
*/
public class ActiveTerminalPool {
private static final Map<String, TerminalInfo> terminals = new HashMap<String, TerminalInfo>();

private ActiveTerminalPool() {
}

/**
* 向在线终端集合中添加一个终端信息
*
* @param info
*/
public static synchronized void add(TerminalInfo info) {
terminals.put(info.getTerminalId(), info);
}

/**
* 通过终端编号获取一个在线的终端的信息,如果这个终端不在线,那么将会返回null
*
* @param terminalId
* - 终端的编号
*/
public static synchronized TerminalInfo get(String terminalId) {
return terminals.get(terminalId);
}

/**
* 获得所有的在线的终端的信息
*
* @return
*/
public static synchronized Collection<TerminalInfo> getActiveTerminalInfos() {
return terminals.values();
}

/**
* 从在线终端集合中移除一个终端信息
*
* @param terminalId
* - 要移除的终端的编号
*/
public static synchronized void remove(String terminalId) {
// // 使用Iterator对象可以避免java.util.ConcurrentModificationException
// for (Iterator<TerminalInfo> it = terminals.values().iterator(); it
// .hasNext();) {
// TerminalInfo info = it.next();
// if (info.getTerminalId().equals(terminalId)) {
// it.remove();
// break;
// }
// }

terminals.remove(terminalId);
}

/**
* 设置最后一次在线检测的时间
*
* @param terminalId
* - 要设置的终端的编号
* @param lastOnLineCheckTime
* - 要设置的最后一次检测的时间
*/
public static synchronized void setLastOnLineCheckTime(String terminalId,
long lastOnLineCheckTime) {
terminals.get(terminalId).setLastOnLineCheckTime(lastOnLineCheckTime);
}

/**
* 获得最后一次在线检测的时间
*
* @param terminalId
* - 终端的编号
* @return 最后一次检测的时间
*/
public static synchronized long getLastOnLineCheckTime(String terminalId) {
return terminals.get(terminalId).getLastOnLineCheckTime();
}
}


terminals 对象应该是在类加载的时候就已经创建好了,但是我的应用程序仍然会在有的时候(并不频繁)报出terminals 对象为空的异常。感觉就像是terminals 被回收了。。。
哪位高手能给点解释?
...全文
478 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lujun0108 2011-07-13
  • 打赏
  • 举报
回复
该死的,日志被人删掉了。等以后再出现这个问题再说吧。谢谢大家。
飞跃颠峰 2011-07-13
  • 打赏
  • 举报
回复
你能确定不是terminals.get(terminalId)为null吗?
lujun0108 2011-07-13
  • 打赏
  • 举报
回复
唔 是哦 有这个可能 我看一下日志
bianhei000 2011-07-13
  • 打赏
  • 举报
回复
按理说应该不会为null吧
你确定是terminals这个对象为空?是不是和他在同一行的其他对象是null的
lujun0108 2011-07-13
  • 打赏
  • 举报
回复
恩 是哦 虽然我也知道这个道理 但是为什么那个对象在一段时间之后莫名其妙的变成了null了呢。。
healer_kx 2011-07-13
  • 打赏
  • 举报
回复
static的就不在gc之列。而且被Map管理的对象,也就不会被GC系统mark到了。

62,614

社区成员

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

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