java - java.util.HashMap 中的无限循环

标签 java hashmap vaadin infinite-loop

我这里经常有一些 Vaadin 代码阻塞,我不知道问题是什么:

Thread 7892: (state = IN_JAVA)
 - java.util.HashMap.getEntry(java.lang.Object) @bci=61, line=349 (Compiled frame; information may be imprecise)
 - java.util.HashMap.containsKey(java.lang.Object) @bci=2, line=335 (Compiled frame)
 - java.util.HashSet.contains(java.lang.Object) @bci=5, line=184 (Compiled frame)
 - com.vaadin.ui.Table.unregisterPropertiesAndComponents(java.util.HashSet, java.util.HashSet) @bci=85, line=1693 (Compiled frame)
 - com.vaadin.ui.Table.refreshRenderedCells() @bci=992, line=1641 (Compiled frame)
 - com.vaadin.ui.Table.valueChange(com.vaadin.data.Property$ValueChangeEvent) @bci=23, line=2897 (Compiled frame)
 - com.vaadin.data.util.IndexedContainer.firePropertyValueChange(com.vaadin.data.util.IndexedContainer$IndexedContainerProperty) @bci=140, line=553 (Compiled frame)
 - com.vaadin.data.util.IndexedContainer.access$1000(com.vaadin.data.util.IndexedContainer, com.vaadin.data.util.IndexedContainer$IndexedContainerProperty) @bci=2, line=64 (Compiled frame)
 - com.vaadin.data.util.IndexedContainer$IndexedContainerProperty.setValue(java.lang.Object) @bci=202, line=915 (Compiled frame)
 - com.aimprosoft.wavilon.backgroundthreads.ChangeCdrThread.insertNewPersonIntoTable(com.aimprosoft.wavilon.model.Person, com.vaadin.ui.HorizontalLayout, com.aimprosoft.wavilon.ui.menuitems.CallContent, com.vaadin.ui.Table) @bci=924, line=208 (Interpreted frame)
 - com.aimprosoft.wavilon.backgroundthreads.ChangeCdrThread$RepaintTableThread.run() @bci=622, line=446 (Compiled frame)

有人可以建议任何进一步调试此问题的方法吗?该问题很少发生,并且很难重现。

最佳答案

根据它在代码中的位置,我能想到的唯一解释是有多个线程在没有正确同步的情况下访问和更新 HashMap。这可能会导致 map 的数据结构损坏,并可能导致无限循环。

我想不出 java.util.HashMap.getEntry 会阻塞的任何其他原因。它不执行任何同步或任何 I/O。


Roland Illig 评论:

The line number indeed suggests that the code hangs in one of the e = e.next loops.

这支持了我的假设。由两个(或更多)线程对哈希表执行的特定操作序列导致在其中一个哈希链中创建循环/周期。发生这种损坏是因为执行操作的线程之间没有足够的同步。这种事情很少发生,但一旦发生,腐败就不会消失。

如果不深入查看 Vaadin 源代码,我无法准确地告诉您它是 Vaadin 错误,还是您使用 Vaadin 的方式中的错误。两种解释都是合理的。

更新

基于 this article (在下面的评论中提供),我会说这很可能是您的应用程序同步(或不同步)方式的问题。

关于java - java.util.HashMap 中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10219724/

相关文章:

JAVA XML : get content Node

java - 创建 Flux.fromIterable 后如何运行 onClose 操作?

Java HashMap.Entry 类未找到

java - 不使用 putAll() 从一个 HashMap 复制到另一个 HashMap

java - 没有编译器错误的多个返回语句

java - 自动编译线程类中的类。请解释

java - HashMap 的自定义哈希码/等于操作

javascript - 如何将 vaadin-icon 导入 React 组件?

java - 将 Vaadin 与谷歌应用引擎一起使用

Vaadin 通过链接加载另一个 View ?