【问题标题】:How to check if thread holds the monitor in IntelliJ?如何检查线程是否在 IntelliJ 中保存监视器?
【发布时间】:2020-05-02 09:58:38
【问题描述】:
在处理 IntelliJ 时,我无法检查线程是否持有锁。
在 Eclipse GUI 上,线程上有一个类似 lock 的图标,告诉我们它正在持有 lock。
在下面的代码快照中,我的线程位于notifyElementAdded() 并持有锁,但是,在线程堆栈中没有来自Intellij 的此类图标或提示
所以我的问题是如何在 IntelliJ GUI 上进行检查。
【问题讨论】:
标签:
java
multithreading
intellij-idea
ide
intellij-plugin
【解决方案1】:
Java 中的 Thread 类实际上有一个布尔属性 - Thread.holdsLock()。
要获取持有监视器的线程的名称,您可以使用下面的代码示例:
public static long getMonitorOwner(Object obj)
{
if (Thread.holdsLock(obj))
{
return Thread.currentThread().getId();
}
}
【解决方案2】:
我认为没有类似的功能。但是你仍然可以通过获取转储来检查
你可以在Debug窗口中点击Get Thread Dump,然后你可以在日志中看到locked,就可以看出线程实际上是持有锁的
【解决方案3】:
使用加号按钮在 Intellij 调试控制台中创建自定义变量,如下图所示。
现在每次在调试模式下运行代码时,都会在所有调试点重新计算此变量。
我创建了一个变量-Thread.holdsLock(AwsS3ClientHelper.class),因为我正在获取类本身的锁。您可以在那里编写您选择的任何变量。在您的特定情况下,它将是Thread.holdsLock(observers)。
【解决方案4】:
这可能是 IntelliJ 将其包含到其 GUI 产品中的潜在功能请求。
为了验证这一点,您可以使用 java.lang.Thread.holdsLock() 方法进行验证,当且仅当当前线程持有指定对象上的监视器锁时才返回 true
public static boolean holdsLock(Object obj)
下面sn-p的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));
}
}