Как проверить, держит ли поток монитор в IntelliJ? - PullRequest
8 голосов
/ 02 мая 2020

Во время работы над IntelliJ я не могу проверить, удерживает ли поток блокировку или нет.

При затмении GUI на нити есть значок lock, говорящий о том, что нам, что он держит, что lock.

В приведенном ниже снимке кода мой поток находится в notifyElementAdded() и, тем не менее, удерживает блокировку, в стеке потоков нет такого значка или указания от Intellij

Итак, мой вопрос, как проверить то же самое на IntelliJ GUI.

enter image description here

Ответы [ 4 ]

4 голосов
/ 07 мая 2020

На самом деле в Java Thread.holdsLock () есть логический атрибут для класса Thread. чтобы получить имя потока, который содержит монитор, вы можете использовать следующий пример кода:

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

    }
}
3 голосов
/ 09 мая 2020

Создайте пользовательскую переменную в консоли отладки Intellij с помощью кнопки «плюс», как показано на рисунке ниже.

Теперь каждый раз, когда вы запускаете код в режиме отладки, эта переменная будет пересчитываться во всех ваших точках отладки.

Я создал переменную - Thread.holdsLock(AwsS3ClientHelper.class) с момента получения блокировка самого класса. Вы можете написать любую переменную на ваш выбор. В вашем конкретном случае это будет Thread.holdsLock(observers).

enter image description here

3 голосов
/ 05 мая 2020

Я не думаю, что есть подобная функциональность. Но вы все еще можете проверить, получив дамп

Get Thread Dump

. Вы можете нажать Get Thread Dump в окне отладки, а затем вы увидите locked в журнал, чтобы увидеть, что поток фактически удерживает блокировку

0 голосов
/ 11 мая 2020

Это может быть потенциальный запрос на добавление IntelliJ в свой продукт GUI.

Программно, чтобы проверить это, вы можете использовать метод java .lang.Thread.holdsLock (), который возвращает true тогда и только тогда, когда текущий поток удерживает блокировку монитора для указанного объекта

public static boolean holdsLock(Object obj)

Ниже приведен фрагмент метода запуска для справки,

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));
   }
 }
...