如何在IntelliJ中检查线程是否保持显示器?

问题描述 投票:1回答:1

在工作中 IntelliJ 我无法检查该线程是否持有锁。

在eclipse GUI上有一个 lock 像图标一样贴在线上,告诉我们它正拿着那个 lock.

在下面的代码快照中,我的线程位于 notifyElementAdded() 并持有锁,但在线程堆栈中,没有这样的Icon或暗示,从 Intellij

所以我的问题是如何在IntelliJ GUI上检查同样的问题。

enter image description here

java multithreading intellij-idea ide intellij-plugin
1个回答
4
投票

实际上有一个布林属性的 Thread Java中的类 - Thread.holdsLock(). 要想获得持有监视器的线程名称,可以使用下面的代码示例。

public static long getMonitorOwner(Object obj)
{
    if (Thread.holdsLock(obj)) 
    {
        return Thread.currentThread().getId();
    }
}

2
投票

我不认为有类似的功能. 但你仍然可以通过获取dump来检查

Get Thread Dump

您可以点击 Get Thread Dump 在Debug窗口中,然后你可以看到 locked 在日志中查看该线程是否真的持有锁。


2
投票

在Intellij调试控制台中使用加号按钮创建一个自定义变量,如下图所示。

现在每次你在调试模式下运行代码时,这个变量将在你的所有调试点重新计算。

我创建了一个变量- Thread.holdsLock(AwsS3ClientHelper.class) 因为我是在获取类本身的锁。你可以在那里写任何你选择的变量。在你的特殊情况下,它将是 Thread.holdsLock(observers).

enter image description here


0
投票

这可能是一个潜在的功能要求,IntelliJ可以将其包含到他们的GUI产品中。

在程序上,为了验证这一点,你可以使用java.lang.Thread.h holdsLock()方法,如果且仅当当前线程在指定对象上持有监控锁时,该方法才返回true。

public static boolean holdsLock(Object obj)

以下是运行方法的片段,供参考。

public void run() {

   /* returns true if thread holds monitor lock */

   // returns false
   System.out.println("Holds Lock = " + Thread.holdsLock(this));  

   synchronized (this) {
      // returns true
      System.out.println("Holds Lock = " + Thread.holdsLock(this));
   }
 }
© www.soinside.com 2019 - 2024. All rights reserved.