gpt4 book ai didi

java - 非常不寻常的情况 - 线程被它持有的锁阻塞?

转载 作者:搜寻专家 更新时间:2023-11-01 03:30:39 24 4
gpt4 key购买 nike

我正在处理的这个 java 程序似乎在启动时挂起,所以我尝试使用 jconsole 来调试这个问题。事实证明,它正在等待对声明为 -

的方法的调用
synchronized void stopQuery()

但这里是疯狂的部分,“synchronized”方法的锁已经被为其阻塞的线程持有。在执行 getThreadInfo() MXBean 方法后,我附上了 JConsole 的屏幕截图。

请注意,lockOwnerId 和 threadId 是相同的!这怎么可能?

alt text

编辑:
Link 到这种情况的堆栈跟踪之一。请注意,在查看堆栈跟踪后,可能会出现即使“org.eclipse.jdt.internal.ui.text.JavaReconciler”线程也在尝试锁定同一个 DiskIndex 对象,但如果您查看对象地址,您会看到它实际上是一个不同的 DiskIndex 对象。

编辑 2:
Another Link 到我重现此问题时获得的不同堆栈跟踪。比较两者以了解共同点应该会有所帮助。

最佳答案

这看起来像是一个特别讨厌的僵局。如果没有更多信息,很难确定。不过,这是我在没有代码的情况下看到的:

当“Worker-3”持有引用 0x00002aace2276ad0 的锁时,“Text Viewer Hover Presenter”和“Worker-3”之间的对象引用 0x00002aace2276720 可能出现死锁(或至少争用)。

第二个引用似乎是导致一大堆线程阻塞的原因(特别是“Worker-4”、“Worker-1”和“Worker-0”)。

我的建议是检查 ASTProvider.java 的第 450 行(查看前两行的堆栈跟踪,其中似乎持有可疑对象锁,但似乎没有通过 wait())。我还建议尝试运行锁定到单个内核的可执行文件(假设这是一个多核系统)。

下一段看起来值得测试的代码是 SelectionListenerWithASTManager.java 第 153 行(其中引用 0x00002aace2276ad0 被锁定,导致 Workers 阻塞)。

0x00002aace2276720 的储物柜:

"Text Viewer Hover Presenter" daemon prio=10 tid=0x00002aad20166400 nid=0x51f4 in Object.wait() [0x000000004254c000..0x000000004254dd90]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00002aace2276720> (a java.lang.Object)
at java.lang.Object.wait(Object.java:485)
at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST(ASTProvider.java:450)
- locked <0x00002aace2276720> (a java.lang.Object)
at org.eclipse.jdt.ui.SharedASTProvider.getAST(SharedASTProvider.java:129)
at org.eclipse.jdt.internal.ui.text.java.hover.NLSStringHover.getHoverInfo(NLSStringHover.java:87)
at org.eclipse.jdt.internal.ui.text.java.hover.AbstractJavaEditorTextHover.getHoverInfo2(AbstractJavaEditorTextHover.java:86)
at org.eclipse.jdt.internal.ui.text.java.hover.BestMatchHover.getHoverInfo2(BestMatchHover.java:129)
at org.eclipse.jdt.internal.ui.text.java.hover.JavaEditorTextHoverProxy.getHoverInfo2(JavaEditorTextHoverProxy.java:82)
at org.eclipse.jface.text.TextViewerHoverManager$4.run(TextViewerHoverManager.java:166)

"Worker-3" prio=10 tid=0x00002aad132c3800 nid=0x5166 in Object.wait() [0x0000000042249000..0x000000004224ab10]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00002aace2276720> (a java.lang.Object)
at java.lang.Object.wait(Object.java:485)
at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST(ASTProvider.java:450)
- locked <0x00002aace2276720> (a java.lang.Object)
at org.eclipse.jdt.ui.SharedASTProvider.getAST(SharedASTProvider.java:129)
at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$PartListenerGroup.calculateASTandInform(SelectionListenerWithASTManager.java:168)
at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$3.run(SelectionListenerWithASTManager.java:153)
- locked <0x00002aace2276ad0> (a java.lang.Object)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

在 0x00002aace2276ad0 上被阻止

"Worker-4" prio=10 tid=0x00002aad132c4000 nid=0x5167 waiting for monitor entry [0x000000004234b000..0x000000004234bc90]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$3.run(SelectionListenerWithASTManager.java:153)
- waiting to lock <0x00002aace2276ad0> (a java.lang.Object)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

"Worker-1" prio=10 tid=0x00002aad12835800 nid=0x5164 waiting for monitor entry [0x0000000041a42000..0x0000000041a42a10]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$3.run(SelectionListenerWithASTManager.java:153)
- waiting to lock <0x00002aace2276ad0> (a java.lang.Object)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

"Worker-0" prio=10 tid=0x00002aad11a0ac00 nid=0x5146 waiting for monitor entry [0x0000000041941000..0x0000000041941d90]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$3.run(SelectionListenerWithASTManager.java:153)
- waiting to lock <0x00002aace2276ad0> (a java.lang.Object)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

关于java - 非常不寻常的情况 - 线程被它持有的锁阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/336696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com