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

目前我们正在分析一个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  (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  (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  (a com.tc.object.RemoteObjectManagerImpl) 

特别是我们不明白

 - locked  (a com.tc.object.RemoteObjectManagerImpl) 

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

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

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

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

什么意思是“ – 锁定<0x00007f847612c820>(com.tc.object.RemoteObjectManagerImpl)”。

它意味着它在该锁的同步块内。 它可以是WAITING(在这种情况下,另一个线程可以获取/保持锁定,或RUNNING,在这种情况下,它持有锁定。

那些线程正在等待获取锁定,而不是持有锁定。

没有不同的线程无法锁定相同的对象。 其他人持有锁,转储中的所有线程都在等待锁。