2012-06-07 4 views
0

У нас есть объект CollectedInfo, который содержит Hashtable. В нашем приложении мы заполняем это Hashtable, а затем перебираем его для выполнения операций вставки. Различные потоки, используемые одновременно для выполнения этой операции.AbstractMethodError из java.util.Hashtable при вызове метода get

При извлечении значения из 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).

+1

. Вам нужно указать код. –

+0

Вы видите ту же проблему при работе в других системах? Поскольку http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/AbstractMethodError.html заключается в том, что эта ошибка возникает из-за вызова абстрактного метода или «определение какого-либо класса несовместимо изменилось с тех пор текущий исполняемый метод был последний скомпилирован ' –

+0

@SeanPatrickFloyd Класс, который загружает информацию в объект CollectedInfo, отличается, этот класс используется для сбора данных и добавления его в этот объект, а затем, наконец, передать его методу YYMgr.saveData. Здесь выполняется итерация, и значения сохраняются в БД. Существует несколько экземпляров объекта CollectedInfo, вызываемых отдельным потоком, которые собирают данные, а затем сохраняют их в DB – Ayush

ответ

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 
} 
+0

Что относительно конкурирующих тем? Это не защищает от одновременных обновлений. – Bohemian

+0

Каждый поток имеет свой собственный объект для сброса значений. Следовательно, нет никаких шансов попасть в другую полосу.Сейчас я тестирую это на платформе Windows, чтобы проверить, есть ли что-нибудь, что связано с родным lib – Ayush

2

Во-первых, Hashtable в основном HashMap, так что ...

У вас есть:

  • a HashMap
  • Несколько потоков с использованием HashMap одновременно

Что потребность является HashMap, который кодируется для параллельного доступа.

К счастью, уже существует: ConcurrentHashMap. Единственное изменение, которое вам понадобится для вашего кода, - использовать специальный поточно-безопасный метод. putIfAbsent(K, V).

. .
Смежные вопросы