我这里经常有一些 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/