在IntelliJ
上工作时,我无法检查线程是否持有锁。
在Eclipse GUI上,线程上有一个lock
之类的图标,告诉我们它持有lock
。
在下面的代码快照中,我的线程位于notifyElementAdded()
并保持锁定,但是,在线程堆栈中,没有这样的图标或来自Intellij
的暗示
所以我的问题是如何在IntelliJ GUI上检查它。
答案 0 :(得分:4)
Java中的Thread
类实际上有一个布尔属性-Thread.holdsLock()
。
要获取保存监视器的线程的名称,您可以使用下面的代码示例:
public static long getMonitorOwner(Object obj)
{
if (Thread.holdsLock(obj))
{
return Thread.currentThread().getId();
}
}
答案 1 :(得分:2)
答案 2 :(得分:2)
如下图所示,使用加号按钮在Intellij调试控制台中创建自定义变量。
现在,每次在调试模式下运行代码时,都会在所有调试点重新计算此变量。
我创建了一个变量Thread.holdsLock(AwsS3ClientHelper.class)
,因为我获得了类本身的锁。您可以在此处编写您选择的任何变量。在您的特定情况下,它将为Thread.holdsLock(observers)
。
答案 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));
}
}