几个线程可以在Java中对同一个监视器进行锁定吗?

Lar*_*ars 4 java concurrency terracotta locking monitor

目前我们正在分析一个tomcat线程转储.在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)
Run Code Online (Sandbox Code Playgroud)

特别是我们不明白

- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
Run Code Online (Sandbox Code Playgroud)

在我们的理解中,它表示当时有三个线程正在锁定同一个监视器.根据我们的理解,根据JLS,这是不可能的.

我们对线程转储的解释是否正确?

axt*_*avt 10

看起来所有这些线程都在等待与监视器关联的条件,即它们调用wait()该监视器的方法.

当线程调用wait()它拥有的监视器时,它会临时释放监视器,并在返回时需要重新获取它wait().因此,您可以拥有多个用于拥有监视器的线程,但现在正在等待wait()方法.

  • @axtavt线程无法等待重新获取.如果他们正在等待重新获得他们的状态将是"阻止"而不是"等待" (2认同)