Могут ли несколько потоков удерживать блокировку на одном мониторе в Java? - PullRequest
4 голосов
/ 19 января 2012

В настоящее время мы анализируем дамп потока Tomcat.Единый дамп потока всех потоков, запущенных в то же время на коте, содержит следующие строки:

...
"soldOutJmsConsumerContainer-1" prio=10 tid=0x00007f8409c14800 nid=0x231 in Object.wait() [0x00007f8403a9f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
    at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
    - locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
...
"catalina-exec-33" daemon prio=10 tid=0x0000000041bc4000 nid=0x832 in Object.wait() [0x00007f8400f73000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
    at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
    - locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
...
"catalina-exec-109" daemon prio=10 tid=0x0000000041469800 nid=0x1e87 in Object.wait() [0x00007f83f84c1000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
    at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
    - locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)

В частности, мы не понимаем

- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)

В нашем понимании это говоритпотоки удерживают блокировку на одном мониторе в это время.В нашем понимании и согласно JLS это невозможно.

Правильна ли наша интерпретация дампа потока?

Ответы [ 4 ]

10 голосов
/ 19 января 2012

Похоже, что все эти потоки ожидают состояния, связанного с монитором, т.е. они вызвали wait() метод этого монитора.

Когда поток вызывает wait() на принадлежащем ему мониторе, он временно освобождаетсямонитор и нужно вернуть его при возврате с wait().Таким образом, у вас может быть несколько потоков, которые раньше принадлежали монитору, но теперь ожидают в методе wait().

2 голосов
/ 19 января 2012

Что означает "- заблокирован <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)".

Это означает, что он находится внутри синхронизированного блока для этой блокировки.Это может быть с ОЖИДАНИЕМ (в этом случае другой поток может получить / удерживать блокировку, или ВЫПОЛНЕНИЕ, и в этом случае он удерживает блокировку.

1 голос
/ 19 января 2012

Эти потоки ожидают , чтобы получить блокировку, не удерживая блокировку.

0 голосов
/ 19 января 2012

Никакие разные потоки не могут удерживать блокировку одних и тех же объектов. Кто-то еще удерживает блокировку, и все потоки в дампе ожидают этой блокировки.

...