Почему я вижу ConcurrentModificationException в Java 1.7.0? - PullRequest
1 голос
/ 06 июня 2019

У нас есть приложение на базе Eclipse RCP (платформа Rich Client), которое запускается через javaws. Когда приложение загружается и запускается, я вижу следующее в консоли Java:

Detected from bootclasspath: C:\\Program Files\\Java\\jre7\\lib\\deploy.jar
Exception in thread "HandshakeCompletedNotify-Thread" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
    at java.util.HashMap$EntryIterator.next(Unknown Source)
    at java.util.HashMap$EntryIterator.next(Unknown Source)
    at sun.security.ssl.SSLSocketImpl$NotifyHandshakeThread.run(Unknown Source)

Выше приведен полный след стека. Мы недавно обновили приложение, и я вижу это. Это происходит с Java 1.7.0. Я также попробовал то же самое приложение с Java 1.8.0_144 и НЕ видел исключения.

Что меня беспокоит, так это то, что при запуске более старой версии приложения на 1.7.0 я не вижу исключения. Трассировка показывает только классы java, поэтому мне трудно знать, где это может происходить, или это просто связано с Java.

Кроме исключения, приложение работает нормально. Любые указатели будут полезны.

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

В целом, ConcurrentModificationException создается с максимальной отдачей. В частности: если выдается исключение ConcurrentModificationException, у вас всегда есть ошибка, но если она не выдается, у вас может быть просто ошибка, и она не может ее обнаружить.

Точные детали того, как выполняется это обнаружение, зависят от версии Java; иногда это работает, иногда это не так, и когда это работает, может отличаться. Но если вы получили исключение ConcurrentModificationException, в любой версии в вашем коде есть ошибка одновременного изменения.

0 голосов
/ 06 июня 2019

Следующий исходный код может дать вам несколько советов.

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/sun/security/ssl/SSLSocketImpl.java

В этом случае в Java 7 создатели java 7 используют HashMap<HandshakeCompletedListener, AccessControlContext>, и я вижу синхронизированные методы для добавления и удаления. Я знаю, что это не решит вашу проблему, но может дать вам некоторые общие сведения.

...