如何在IntelliJ中检查线程是否持有监视器?

11

在使用IntelliJ时,我无法检查线程是否持有锁。

在eclipse的GUI中,对于线程会有一个带有lock图标的提示,告诉我们它正在持有那个lock

在下面的代码快照中,我的线程位于notifyElementAdded(),并且持有锁,但是,在线程堆栈中没有来自Intellij的图标或提示。

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

输入图像描述


1
或许值得向Jetbrains提出一个新功能请求 https://youtrack.jetbrains.com/issues/IDEA?q=thread%20holding%20lock - nabster
4个回答

4

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

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

2
在Intellij的调试控制台中使用加号按钮创建自定义变量,如下图所示。现在每次以调试模式运行代码时,该变量将在所有调试点重新计算。
我创建了一个变量-Thread.holdsLock(AwsS3ClientHelper.class),因为我正在获取类本身的锁。你可以在那里写任何你选择的变量。在你特定的情况下,它将是Thread.holdsLock(observers)

enter image description here


2
我认为没有类似的功能。但您仍然可以通过获取转储来检查。

Get Thread Dump

您可以在调试窗口中单击“获取线程转储”,然后可以查看日志中的“locked”以查看线程实际上正在持有锁。

0

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

从编程角度来看,您可以使用java.lang.Thread.holdsLock()方法进行验证,该方法仅在当前线程持有指定对象上的监视器锁时返回true。

public static boolean holdsLock(Object obj)

以下是参考的run方法代码片段:

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));
   }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接