为什么在Java 1.7.0中看到ConcurrentModificationException?

时间:2019-06-06 19:37:23

标签: java eclipse-rcp

我们有一个基于Eclipse RCP(Rich Client Platform)的应用程序,它是通过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相同的应用程序,但DID看不到异常。

让我困扰的是,当我在1.7.0上运行较旧版本的应用程序时,没有看到异常。跟踪仅显示Java类,因此我很难知道这可能发生在哪里,或者仅与Java有关。

除了例外,该应用程序似乎运行良好。任何指针都会有所帮助。

2 个答案:

答案 0 :(得分:2)

通常,ConcurrentModificationException会尽力而为。具体来说:如果引发ConcurrentModificationException,则始终有一个错误,但是如果未引发,则可能只是一个错误而无法检测到。

如何进行检测的确切细节在Java版本之间有所不同。有时它会起作用,有时却不会,并且何时起作用可能会有所不同。但是,如果您有任何版本的ConcurrentModificationException,则您的代码中会存在并发修改错误。

答案 1 :(得分:0)

以下源代码可能会给您一些提示。

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

在这种情况下,在Java 7中,java 7创建者使用HashMap<HandshakeCompletedListener, AccessControlContext>,我看到了用于添加和删除的同步方法。我知道这不会解决您的问题,但是可能会给您一些轮廓。

相关问题