private static final对象也被回收了?
首先看代码:
/**
* 这个对象存储了在线的终端的信息。这个对象是线程安全的 ,你可以在多线程中使用它。
* 向这个对象中添加或者是移除在线终端的信息,将会直接影响到数据库中存储的终端在线状态。当然,也会最终影响到作业监管平台上面的终端在线情况监控。<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 被回收了。。。
哪位高手能给点解释?