我们有一个对象CollectedInfo
,其中包含一个Hashtable
。在我们的应用程序中,我们填充此Hashtable
,然后迭代它以执行插入操作。同时使用不同的线程来执行此操作。
从Hashtable
中检索值时,我们看到AbstractMethodError
异常,显示了来自 get 方法的跟踪 Hashtable
。一旦出现此异常,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)。
首先,Hashtable
基本上是一个HashMap
,所以...
你有:
- 一
HashMap
- 多个线程同时使用
HashMap
需要的是针对并发访问进行编码的HashMap
。
幸运的是,一个已经存在:ConcurrentHashMap
.您需要对代码进行的唯一更改是使用特殊的线程安全方法putIfAbsent(K, V)
获取一个迭代器类对象,然后尝试获取哈希值。
//声明
Iterator itr = hashtable.keySet().iterator();
//加工
while(itr.hasNext())
{
String key = (String)itr.next();
String value = (String)hashtable.get(key);
// write your desired code
}