以编程方式获取堆栈转储中Java监视器的地址?

Bee*_*ope 5 java debugging concurrency stack-trace jvm-hotspot

如果你得到一个过程,如堆栈转储,通过jstack,你会得到关于锁定的监视器(和同步),一个地址为每个信息.例如,从一个简单的死锁双线程进程(使用jstack):

"Thread-0" prio=10 tid=0x00007f1444042000 nid=0x2818 waiting for monitor entry [0x00007f14433ca000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
    - waiting to lock <0x00000007c14e6378> (a java.lang.Object)
    - locked <0x00000007c14e6368> (a java.lang.Object)
    at java.lang.Thread.run(Thread.java:619)

... (omitted some lines here)

Java stack information for the threads listed above:
===================================================
"Thread-1":
    at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
    - waiting to lock <0x00000007c14e6368> (a java.lang.Object)
    - locked <0x00000007c14e6378> (a java.lang.Object)
    at java.lang.Thread.run(Thread.java:619)
"Thread-0":
    at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
    - waiting to lock <0x00000007c14e6378> (a java.lang.Object)
    - locked <0x00000007c14e6368> (a java.lang.Object)
    at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)

有没有什么办法让,在Java代码运行时,上面显示的地址相同,如0x00000007c14e6368

我已经用显示器对应的对象标识哈希码尝试,以及MonitorInfo通过ThreadMXBean,没有运气(该值不对应,至少在64位Java).

Zag*_*rev -2

所以,你的问题实际上是,是否有某种方法可以确定程序中哪两个对象陷入了死锁?这个简单的例子实际上指出了一种检查死锁的方法。死锁最常见的原因之一是检索多个锁,但顺序不同。因此,请搜索锁定的代码,以确保您始终以相同的顺序请求锁定。

顺便说一句,您需要多个锁来执行某些操作,这意味着您应该更改设计,使任何操作只需要一个锁。