英文:
How to check if thread holds the monitor in IntelliJ?
问题
在使用 IntelliJ
进行工作时,我无法检查线程是否持有锁。
在 Eclipse 的图形界面中,针对线程有一个类似于 lock
的图标,告诉我们它正在持有那个 lock
。
在下面的代码快照中,我的线程正在执行 notifyElementAdded()
并持有锁,然而在线程堆栈中,IntelliJ
没有显示类似的图标或提示。
所以我的问题是如何在 IntelliJ
图形界面中进行相同的检查。
英文:
While working on IntelliJ
, I am unable to check that if the thread is holding the lock or not.
On eclipse GUI there is a lock
like icon against the thread , telling us that it is holding that lock
.
In below code snapshot, my thread is at notifyElementAdded()
and holding the lock however, in a thread stack there is no such Icon or intimation from Intellij
So my question is how to check the same on IntelliJ GUI.
答案1
得分: 4
Thread
类在 Java 中实际上有一个布尔属性 - Thread.holdsLock()
。
要获取持有监视器的线程的名称,您可以使用下面的代码示例:
public static long getMonitorOwner(Object obj)
{
if (Thread.holdsLock(obj))
{
return Thread.currentThread().getId();
}
}
英文:
There is actually a boolean attribute to the Thread
class in Java - Thread.holdsLock()
.
To get the name of the thread which holds the monitor you can use the code example below:
public static long getMonitorOwner(Object obj)
{
if (Thread.holdsLock(obj))
{
return Thread.currentThread().getId();
}
}
答案2
得分: 2
我不认为有类似的功能。但你仍然可以通过获取转储信息来检查。
你可以在调试窗口中点击 获取线程转储
,然后你可以在日志中看到 locked
,以查看线程实际上是否持有锁。
英文:
I don't think there is a similar functionality. But you can still check by getting the dump
You can click on Get Thread Dump
in Debug window and then you can see the locked
in the log to see that the thread is actually holding the lock
答案3
得分: 2
在IntelliJ的调试控制台中,按照下面图像中所示的方法,通过加号按钮创建一个自定义变量。
现在,每当你在调试模式下运行代码时,这个变量将会在所有的调试断点处重新计算。
我创建了一个名为Thread.holdsLock(AwsS3ClientHelper.class)
的变量,因为我正在对该类本身进行锁定。你可以在那里写入任何你选择的变量。在你的特定情况下,它将是Thread.holdsLock(observers)
。
英文:
Create a custom variable in the Intellij debugging console using the plus button as shown in the image below.
Now every time you run the code in the debug mode, this variable will be re-calculated at your all debug points.
I created a variable- Thread.holdsLock(AwsS3ClientHelper.class)
since I was acquiring a lock on the class itself. You can write any variable of your choice there. In your particular case, it will be Thread.holdsLock(observers)
.
答案4
得分: 0
这可以作为 IntelliJ 的潜在功能请求,将其包含在他们的 GUI 产品中。
在编程上,要验证这一点,您可以使用 java.lang.Thread.holdsLock() 方法,该方法返回 true 当且仅当当前线程在指定的对象上持有监视器锁。
public static boolean holdsLock(Object obj)
以下是参考的 run 方法代码段,
public void run() {
/* 如果线程持有监视器锁则返回 true */
// 返回 false
System.out.println("Holds Lock = " + Thread.holdsLock(this));
synchronized (this) {
// 返回 true
System.out.println("Holds Lock = " + Thread.holdsLock(this));
}
}
英文:
This can be a potential feature request for IntelliJ to include this to their GUI product.
Programmatically, to verify this you can use the java.lang.Thread.holdsLock() method which returns true if and only if the current thread holds the monitor lock on the specified object
public static boolean holdsLock(Object obj)
Below snippet of run method for reference,
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));
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论