“等待时锁定释放:”在Java线程转储中意味着什么?

时间:2011-06-15 14:11:43

标签: java ejb-2.x weblogic8.x

在此线程转储中:

INFO   | jvm 3    | 2011/06/08 13:36:12 | "ExecuteThread: '38' for queue: 'default'" id=55 idx=0x78 tid=5316 prio=5 alive, in native, waiting, daemon
INFO   | jvm 3    | 2011/06/08 13:36:12 |     -- Waiting for notification on: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828[fat lock]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at jrockit/vm/Threads.waitForSignal(J)Z(Native Method)
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at java/lang/Object.wait(J)V(Native Method)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/locks/ExclusiveLockManager$LockBucket.lock(Ljava/lang/Object;Ljava/lang/Object;I)Z(ExclusiveLockManager.java:504)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     ^-- Lock released while waiting: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828[fat lock]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/locks/ExclusiveLockManager.lock(Ljava/lang/Object;Ljava/lang/Object;I)Z(ExclusiveLockManager.java:261)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/manager/ExclusiveEntityManager.acquireLock(Ljava/lang/Object;Ljavax/transaction/Transaction;I)Z(ExclusiveEntityManager.java:210)[inlined]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/manager/ExclusiveEntityManager.getReadyBean(Ljava/lang/Object;Ljavax/transaction/Transaction;I)Ljavax/ejb/EntityBean;(ExclusiveEntityManager.java:267)[inlined]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/manager/ExclusiveEntityManager.preInvoke(Lweblogic/ejb20/internal/InvocationWrapper;)Ljavax/ejb/EnterpriseBean;(ExclusiveEntityManager.java:242)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/internal/BaseEJBObject.preInvoke(Lweblogic/ejb20/internal/InvocationWrapper;Lweblogic/security/service/ContextHandler;)Lweblogic/ejb20/internal/InvocationWrapper;(BaseEJBObject.java:152)[inlined]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at weblogic/ejb20/internal/EntityEJBObject.preInvoke(Lweblogic/ejb20/internal/MethodDescriptor;Lweblogic/security/service/ContextHandler;)Lweblogic/ejb20/internal/InvocationWrapper;(EntityEJBObject.java:104)[inlined]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/ejb/commodity/ejb_Commodity_etfd4i_EOImpl.getData()Lfoob/ejb/commodity/db/CommodityData;(ejb_Commodity_etfd4i_EOImpl.java:701)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/ejb/item/OurItem.loadCommodityData()V(OurItem.java:172)[optimized]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     ^-- Holding lock: java/lang/Class@0x067EA070[fat lock]
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/ejb/item/OurItem.getCommodityData()Lfoob/ejb/commodity/db/CommodityData;(OurItem.java:251)
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/ejb/item/OurItem.getTheControlGid()Ljava/lang/String;(OurItem.java:259)
INFO   | jvm 3    | 2011/06/08 13:36:12 |     at foob/business/shipment/OurThing.getTheControlGid(Lfoob/util/jdbc/OurConnection;)Ljava/lang/String;(OurThing.java:379)

该行

Lock released while waiting: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828

意思?我们有8个其他线程被阻塞等待java/lang/Class@0x067EA070被释放,这个线程正在持有,但我不明白这个线程阻塞了什么,也不知道锁被释放是什么意思。我原本认为线程转储是一种世界类型的事件,因此有问题的行不会引用在线程转储发生时释放的锁...

此外,它看起来有什么意义(即它上面和下面的线)?

显然我不是Java的期望,所以我希望这不是一个愚蠢的问题。谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

来自Oracle JRockit JDK Tools Guide

  

等待的语义(for   通知)对于Java中的对象是   有点复杂。首先,进入一个   同步块,你必须采取   锁定对象,然后调用   对该对象的wait()。在等待   方法,之前释放锁   线程进入睡眠状态等待a   通知。线程收到时   通知,wait()重新获取   在返回之前锁定。如果一个线程有   采取锁定,正在等待   关于那个锁的通知,该行   在描述何时的堆栈跟踪中   锁定未显示为   (持锁); 显示为(锁定   在等待时释放。)

换句话说,这意味着所述线程具有一个先前获得锁定的对象,然后在它调用object.wait()时稍后释放它。与行为类似的代码模式是:

synchronized(lock) //acquires the lock
{
   ...
   do some work
   ...
   object.wait(); //releases the lock, and waits for a notification
}

<强>更新

在查看堆栈跟踪时,您似乎正在使用Entity EJB Bean,并且考虑到此类实现的操作方式,通常会在实体EJB上获取锁。这实际上取决于用于管理必须访问数据库的并发事务的concurrency strategy。我怀疑bean的数量太少,或者只有一个bean可以锁定。

答案 1 :(得分:1)

在此页面上搜索“已发布锁定”,这可以很好地解释在等待对象的逻辑中发生的情况。

http://download.oracle.com/docs/cd/E13188_01/jrockit/docs142/userguide/apstkdmp.html

此消息似乎表示获取notify()ed的原始wait()调用何时重新捕获对象的锁定。

为了将来的参考,我发现这只是通过谷歌搜索“等待时释放锁定”这是第一页出现...希望你已经在网上搜索,只是不满意你发现了什么,在这种情况下,如果这没有用,我很抱歉。

答案 2 :(得分:0)

这很可能与上面的两行有关:

at java/lang/Object.wait(J)V(Native Method)[optimized]

wait()将释放当前保持的锁定(周围同步块保持的锁定)并等待notify()信号。