Java线程转储中的“等待时释放锁:”是什么意思?

| 在此线程转储中:
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期望者,所以我希望这不是一个愚蠢的问题。谢谢您的帮助!     
已邀请:
        从《 Oracle JRockit JDK工具指南》中,   等待的语义   通知)中的Java对象是   有点复杂。首先,输入   同步块,您必须   锁定对象,然后调用   在该对象上等待。在等待   方法,该锁在释放之前   线程进入睡眠状态,等待一个   通知。当线程接收到   通知,wait()重新获取   返回之前将其锁定。如果一个线程有   拿了锁,正在等待   关于该锁的通知,该行   在堆栈跟踪中描述了何时   锁已被显示为   (持锁);它显示为(锁定   等待时释放。) 换句话说,这意味着该线程具有一个对象,该对象较早获取了一个锁,然后在调用“ 3”时释放了该锁。与行为类似的代码模式是:
synchronized(lock) //acquires the lock
{
   ...
   do some work
   ...
   object.wait(); //releases the lock, and waits for a notification
}
更新资料 在查看堆栈跟踪时,似乎您正在使用实体EJB Bean,并且鉴于此类实现的操作方式,通常会在实体EJB上获取锁。这实际上取决于用于管理必须访问数据库的并发事务的并发策略。我会怀疑bean的数量太少,或者只有一个bean要锁定。     
        在此页面上搜索“锁定已释放”,它可以很好地说明在等待对象的逻辑内发生了什么。 http://download.oracle.com/docs/cd/E13188_01/jrockit/docs142/userguide/apstkdmp.html 看起来,此消息表示何时原始通知(通知)的wait()调用重新捕获了对象的锁。 供以后参考,我通过在\“等待时释放锁\”上进行了Google搜索来发现了这一点,这是显示的第一页...希望您已经在网上进行了搜索并且不满意使用您发现的内容,在这种情况下如果无济于事,我们感到抱歉。     
        它很可能与上面的两行有关:
at java/lang/Object.wait(J)V(Native Method)[optimized]
wait()将释放当前持有的锁(由周围的同步块持有的锁),并等待notify()信号。     

要回复问题请先登录注册