私が得ているエラーを理解するのを手伝ってください:
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);
}
}
メソッドと Set の両方
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に要素を追加しようとし、interatorの場合
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 はそのすべての要素を反復する必要があります (複数の単一の HEARTBEAT_INFO FM を保証できます) が、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