如何检查线程是否在IntelliJ中容纳监视器?

时间:2020-05-02 09:58:38

标签: java multithreading intellij-idea ide intellij-plugin

IntelliJ上工作时,我无法检查线程是否持有锁。

在Eclipse GUI上,线程上有一个lock之类的图标,告诉我们它持有lock

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

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

enter image description here

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

Get Thread Dump

您可以在“调试”窗口中单击Get Thread Dump,然后在日志中看到locked,以查看该线程实际上已持有该锁。

答案 2 :(得分:2)

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

现在,每次在调试模式下运行代码时,都会在所有调试点重新计算此变量。

我创建了一个变量Thread.holdsLock(AwsS3ClientHelper.class),因为我获得了类本身的锁。您可以在此处编写您选择的任何变量。在您的特定情况下,它将为Thread.holdsLock(observers)

enter image description here

答案 3 :(得分: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));
   }
 }