调用get方法时java.util.Hashtable中的AbstractMethodError

调用get方法时java.util.Hashtable中的AbstractMethodError,java,hashtable,Java,Hashtable,我们有一个对象CollectedInfo,它包含一个哈希表。在我们的应用程序中,我们填充这个哈希表,然后迭代它以执行插入操作。同时用于执行此操作的不同线程 从哈希表检索值时,我们看到AbstractMethodError异常,显示了哈希表的get方法的跟踪。一旦出现此异常,java应用程序就会崩溃 我们无法重现异常,但是在一段时间内,我们可以在应用程序中非常一致地看到相同的行为 以下是跟踪: SYS_ERR: Exception running task: java.lang.AbstractM

我们有一个对象
CollectedInfo
,它包含一个
哈希表
。在我们的应用程序中,我们填充这个
哈希表
,然后迭代它以执行插入操作。同时用于执行此操作的不同线程

哈希表
检索值时,我们看到
AbstractMethodError
异常,显示了
哈希表
的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)。

获取迭代器类对象,然后尝试获取哈希值

//声明

 Iterator itr = hashtable.keySet().iterator();
//加工

 while(itr.hasNext())
 { 
    String key = (String)itr.next();  
        String value = (String)hashtable.get(key); 

           // write your desired code
 }

获取迭代器类对象,然后尝试获取哈希值

//声明

 Iterator itr = hashtable.keySet().iterator();
//加工

 while(itr.hasNext())
 { 
    String key = (String)itr.next();  
        String value = (String)hashtable.get(key); 

           // write your desired code
 }
首先,a基本上是a,所以

你有:

  • a
    HashMap
  • 同时使用
    HashMap
    的多个线程
需要的是一个为并发访问而编码的
HashMap

幸运的是,已经存在一个:。您需要对代码进行的唯一更改是使用特殊的线程安全方法。首先,a基本上是a,所以

你有:

  • a
    HashMap
  • 同时使用
    HashMap
    的多个线程
需要的是一个为并发访问而编码的
HashMap


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

您需要显示一些代码您在其他系统上运行时是否看到相同的问题?因为此错误是由于调用抽象方法或“自上次编译当前执行的方法以来,某些类的定义发生了不兼容的更改”@SeanPatrickFloyd将信息加载到CollectedInfo对象中的类不同,用于收集数据并将其添加到此对象中的类,然后最后将其传递给YYMgr.saveData方法。这里迭代完成,值保存在数据库中。单个线程调用CollectedInfo对象的多个实例,这些实例收集数据,然后将其保存到DB@Ajj,该问题不会在正常加载中出现,但当我们尝试在collectedinfo(其中的哈希表)中保存20000个条目时,它在运行了很长时间后出现。如果问题与不同的类相关,那么每次都会出现。您需要显示一些代码在其他系统上运行时是否看到相同的问题?因为此错误是由于调用抽象方法或“自上次编译当前执行的方法以来,某些类的定义发生了不兼容的更改”@SeanPatrickFloyd将信息加载到CollectedInfo对象中的类不同,用于收集数据并将其添加到此对象中的类,然后最后将其传递给YYMgr.saveData方法。这里迭代完成,值保存在数据库中。单个线程调用CollectedInfo对象的多个实例,这些实例收集数据,然后将其保存到DB@Ajj,该问题不会在正常加载中出现,但当我们尝试在collectedinfo(其中的哈希表)中保存20000个条目时,它在运行了很长时间后出现。如果问题与不同的类相关,那么每次都会出现。那么竞争线程呢?这并不能防止并发更新每个线程都有自己的对象来转储值。因此,没有机会进入另一条车道。现在我正在Windows平台上测试它,以检查是否与本机lib有关,那么竞争线程呢?这并不能防止并发更新每个线程都有自己的对象来转储值。因此,没有机会进入另一条车道。现在我正在Windows平台上测试它,以检查是否与本机lib有关