我们有一个对象CollectedInfo
,其中包含Hashtable
。在我们的应用程序中,我们填充此Hashtable
,然后迭代它以执行插入操作。不同的线程同时用于执行此操作。
从Hashtable
检索值时,我们会看到AbstractMethodError
异常,显示来自Hashtable
的get方法的跟踪。只要这个异常出现,java应用程序就会崩溃。
我们无法重现异常,但是我们可以在一段时间内非常一致地看到我们的应用程序中的相同行为。
以下是追踪:
SYS_ERR: Exception running task: java.lang.AbstractMethodError
SYS_ERR: java.lang.AbstractMethodError
SYS_ERR: at java.util.Hashtable.get(Unknown Source)
SYS_ERR: at poll.CollectedInfo.getValuesForColumn(CollectedInfo.java:1026)
SYS_ERR: at poll.YYYMgr.saveData(YYYMgr.java:5346)
SYS_ERR: at poll.YYYMgr.saveData(YYYMgr.java:2412)
SYS_ERR: at poll.YYYMgr.saveData(YYYMgr.java:2250)
SYS_ERR: at poll.CommonPollAPI.saveData(CommonPollAPI.java:579)
SYS_ERR: at poll.XXXXData.run(XXXXData.java:76)
SYS_ERR: at management.scheduler.WorkerThread.run(WorkerThread.java:70)
我们正在使用JRE 1.6.0,重现此问题的操作系统是Linux Red Hat Enterprise Linux Server 5.6 Beta(Tikanga)。
答案 0 :(得分:2)
首先,Hashtable
基本上是HashMap
,所以......
你有:
HashMap
HashMap
需要是为HashMap
而编码以进行并发访问。
幸运的是,已经存在一个:ConcurrentHashMap
。您需要对代码进行的唯一更改是使用特殊的线程安全方法putIfAbsent(K, V)
答案 1 :(得分:1)
获取Iterator类对象,然后尝试获取哈希值。
//声明
Iterator itr = hashtable.keySet().iterator();
//处理
while(itr.hasNext())
{
String key = (String)itr.next();
String value = (String)hashtable.get(key);
// write your desired code
}