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

时间:2014-05-27 04:57:17

标签: 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.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)

相应的代码块是

line 250  out = new BufferedOutputStream(socket.getOutputStream(), BUFFER_LENGTH);

line 331  public void send(Object obj, boolean flush) throws ConnectionException {
.
.
line 342   synchronized(out) {
.         if(!isOpen()) {
.           throw new ConnectionException("Connection closed", url);
.         }  
.
.         header.reset();
.         header.write(B_SEND_EX);
.         header.write((byte)'\r');
.         header.write((byte)'\n');
.         int len = splitInt(val.length);
.         while (len-- > 0) {
.           header.write(splitBuffer[len]);
.         }
.         header.write((byte)'\r');
.         header.write((byte)'\n');
.         header.writeTo(out);
.            out.write(val);
.        if (flush) {
.        out.flush();
.        }
.          }
line 364}

根据上面的堆栈跟踪,它拥有montor lock on&#34; out&#34;在第342行。但它仍处于阻塞状态。 Aslo,它说等待监视器输入[0x00002aaacb4d4000]。 我们无法识别哪个是0x00002aaacb4d4000以及谁拥有锁定,因为除了整个线程转储中的这个位置之外,0x00002aaacb4d4000没有其他事件发生。

即使在拥有监视器锁定之后线程如何处于阻塞状态?

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

Java version: jdk1.6.0_32

如果你能帮助我们理解这个案例,真的很棒。

0 个答案:

没有答案