繁体   English   中英

为什么在Java 1.7.0中看到ConcurrentModificationException?

[英]Why am I seeing ConcurrentModificationException in Java 1.7.0?

我们有一个基于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有关。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM