0

我们有一个 Object CollectedInfo,其中包含一个Hashtable. 在我们的应用程序中,我们填充 this 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 release 5.6 Beta (Tikanga)。

4

2 回答 2

2

首先, aHashtable基本上是 a HashMap,所以...

你有:

  • 一个HashMap
  • 多个线程HashMap同时使用

需要的是为并发访问编码的HashMap

幸运的是,已经存在一个:ConcurrentHashMap. 您需要对代码进行的唯一更改是使用特殊的线程安全方法putIfAbsent(K, V)

于 2012-06-07T07:39:20.280 回答
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
 }
于 2012-06-07T06:29:50.453 回答