Java线程拥有监视器锁,但仍处于阻塞状态

Java线程拥有监视器锁,但仍处于阻塞状态,java,multithreading,concurrency,Java,Multithreading,Concurrency,我们正在处理应用程序中的性能问题,并在线程转储中观察到以下行为 有一个线程拥有montior锁,但仍处于阻塞状态 INT:legacon:41:76" prio=10 tid=0x0000000055df0800 nid=0x2e39 waiting for monitor entry [0x00002aaacb4d4000] java.lang.Thread.State: BLOCKED (on object monitor) at com.leg.common.conn

我们正在处理应用程序中的性能问题,并在线程转储中观察到以下行为

有一个线程拥有montior锁,但仍处于阻塞状态

INT:legacon:41:76" prio=10 tid=0x0000000055df0800 nid=0x2e39 waiting for monitor entry     [0x00002aaacb4d4000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.leg.common.connections.fg.FgConnection.send(FgConnection.java:342)
    - locked <0x00000007345b78c0> (a java.io.BufferedOutputStream)
    at com.leg.mg.core.po.storage.ReplicationConnection.send(ReplicationConnection.java:190)
    at com.leg.mg.core.po.storage.ClusterStorageManager.replicate(ClusterStorageManager.java:620)
    at com.leg.mg.core.po.poEngine.store(poEngine.java:1117)
    at com.leg.mg.core.po.poWorker.storeMessage(poWorker.java:1024)
    at com.leg.mg.proto.RWorker$DocumentMessageSender.run(RouterWorker.java:1976)
    at com.leg.common.threadpool.VirtualThreadGroup$VirtualThreadGroupRunnable.run(VirtualThreadGroup.java:147)
    at com.leg.common.threadpool.ThreadControl.run(ThreadControl.java:201)
    at com.leg.common.threadpool.ThreadPool$PoolThread.run(ThreadPool.java:742)
根据上面的堆栈跟踪,它拥有第342行“out”上的montior锁。但它仍然处于阻塞状态。此外,它还表示正在等待监视器条目[0x00002AACB4D4000]。 我们无法确定哪个是0x00002AACB4D4000以及谁拥有它的锁,因为0x00002AACB4D4000除了在整个线程转储中的这个位置外,没有其他事件发生

线程如何在拥有监视器锁后仍处于阻塞状态

如何识别什么是0x00002AACB4D4000?它会是任何内部java对象吗

Java version: jdk1.6.0_32

如果您能帮助我们了解这个案例,那将非常好。

它等待的监视器不是它拥有的监视器。看起来,
out
使用的系统资源处于锁定状态。如果
out
不是套接字连接的唯一访问器,那么与
out
同步可能不够。@immibis它在等待什么?我在0x00002AACB4D4000上找不到任何其他线程拥有锁。实际上,除此之外,整个转储中没有出现0x00002AACB4D4000的其他事件place@9dan“out”是套接字的唯一访问器。是否有方法确认对象0x00002AACB4D4000或将其与系统资源关联。代码中的其他内容是否在套接字上同步?我注意到,
out
是一个缓冲输出流包装器,而不是实际的套接字流。
Java version: jdk1.6.0_32