为什么我在Java 1.7.0中看到ConcurrentModificationException?

为什么我在Java 1.7.0中看到ConcurrentModificationException?,java,eclipse-rcp,Java,Eclipse Rcp,我们有一个基于EclipseRCP(富客户机平台)的应用程序,它通过javaws启动。下载并启动应用程序后,我会在java控制台中看到以下内容: Detected from bootclasspath: C:\\Program Files\\Java\\jre7\\lib\\deploy.jar Exception in thread "HandshakeCompletedNotify-Thread" java.util.ConcurrentModificationException a

我们有一个基于EclipseRCP(富客户机平台)的应用程序,它通过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)
上面是整个堆栈跟踪。我们最近更新了应用程序,我看到了这一点。这在Java1.7.0中发生。我还使用Java1.8.0_144尝试了相同的应用程序,但没有看到异常

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


除了异常之外,应用程序似乎运行良好。任何指示都会有帮助

一般来说,ConcurrentModificationException是在尽最大努力的基础上抛出的。特别是:如果抛出ConcurrentModificationException,您总是有一个bug,但如果没有抛出,您可能只是有一个bug,而它无法检测到它


如何进行检测的具体细节在不同的Java版本中有所不同;有时有效,有时无效,何时有效可能会有所不同。但是,如果在任何版本中出现ConcurrentModificationException,那么代码中都会出现并发修改错误。

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


在本例中,在Java7中,Java7创建者使用
HashMap
,我看到了用于添加和删除的同步方法。我知道它不会解决您的问题,但它可能会给您一些提纲。

堆栈跟踪似乎不会比sun.security.ssl.SSLSocketImpl$NotifyHandshakeThread更高。有没有办法让我知道它可能发生在哪里?ConcurrentModificationException唯一诚实的答案是,您必须查看应用程序中特定列表对象被修改的每个位置,并检查它是否可能在迭代发生时发生,无论是在同一线程中还是在不同线程中。或者,这听起来可能只是多个线程使用了一个线程不安全的API。同步任何错误代码可以解决问题吗?如果根本原因是并发问题,如多个线程同时执行,则可能是。如果根本原因是在迭代中实际进行修改的代码,那么不是。