Пожалуйста, помогите мне понять ошибку, которую я получаю:
private void replayHistory() {
synchronized (alarmsHistory) {
for (AlarmEvent alarmEvent : alarmsHistory) {
LOG.error("replayHistory " + alarmEvent.type + " " + alarmEvent.source);
sendNotification(alarmEvent.type, alarmEvent.source, alarmEvent.description,
alarmEvent.clearOnOtherStations, alarmEvent.forceClearOnOtherStations);
}
}
}
и метод, который добавляет к нему элемент
private void addToAlarmsHistory(AlarmEvent alarmEvent) {
synchronized (alarmsHistory) {
LOG.error("addToAlarmsHistory " + alarmEvent.type + " " + alarmEvent.source);
alarmsHistory.add(alarmEvent);
}
}
оба метода и набор
private volatile Set<AlarmEvent> alarmsHistory = new LinkedHashSet<AlarmEvent>();
определены в
JmxGwReloadThread extends Thread class
который является внутренним классом в
AlarmManager class
у которого есть метод
private void addToReplayHistory(AlarmEvent alarmEvent) {
if ((jmxThread != null) && (jmxThread.isAlive())) {
jmxThread.addToAlarmsHistory(alarmEvent);
}
}
который вызывается разными интерфейсами (не могу гарантировать, когда и как часто)
В какой-то момент JmxThread запускается и вызывает метод replayHistory.
java.util.ConcurrentModificationException
кидается, рут от
for (AlarmEvent alarmEvent : alarmsHistory) {
Код, вероятно, пытается добавить элемент в AlarmsHistory, и когда интератор
java.util.ConcurrentModificationException
at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:390)
at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:401)
at AlarmManager$JmxGwReloadThread.replayHistory(AlarmManager.java:568)
at AlarmManager$JmxGwReloadThread.run(AlarmManager.java:532)
выдает исключение при вызове nextEntry, но разве синхронизация не должна предотвращать такую проблему?
Логи показывают, что синхронизация не работает - replayHistory должна пройтись по всем своим элементам (могу заверить, что это более одного FM HEARTBEAT_INFO), но она прерывается вызовом addToReplayHistory.
2013-07-11 11:58:33,951 Thread-280 ERROR AlarmManager$JmxGwReloadThread.replayHistory(AlarmManager.java:570) - replayHistory HEARTBEAT_INFO FM
2013-07-11 11:58:33,951 Thread-280 ERROR AlarmManager$JmxGwReloadThread.addToAlarmsHistory(AlarmManager.java:550) - addToAlarmsHistory HEARTBEAT_INFO FM
2013-07-11 11:58:33,952 Thread-280 ERROR Log4jConfigurator$UncaughtExceptionHandler.uncaughtException(Log4jConfigurator.java:253) - Detected uncaught exception in thread: Thread-280
LinkedHashSet
, но в трассировке стека упоминаетсяLinkedHashMap
? - person Dahaka   schedule 11.07.2013LOG
должен быть в цикле, а не перед ним. - person Dahaka   schedule 11.07.2013