【问题标题】: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));
           }
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 2017-07-21
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          相关资源
          最近更新 更多