Что означает «Блокировка освобождена во время ожидания:» в дампе потока Java? - PullRequest
3 голосов
/ 15 июня 2011

В этой теме дамп:

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 ]

2 голосов
/ 15 июня 2011

Из Oracle JRockit JDK Tools Guide ,

Семантика для ожидания (для уведомление) для объекта в Java несколько сложный. Во-первых, чтобы ввести синхронизированный блок, вы должны взять блокировка для объекта, а затем вы звоните wait () для этого объекта. В ожидании метод, блокировка снята раньше нить засыпает в ожидании уведомление. Когда поток получает уведомление, ожидание () повторно принимает заблокировать до возвращения. Если поток имеет взяли замок и ждут уведомление об этом замке, линия в трассировке стека, который описывает, когда замок был взят не показан как (Удерживающий замок); отображается как (Блокировка освобожден во время ожидания.)

Другими словами, это означает, что в указанном потоке есть объект, который получил блокировку раньше, а затем в более поздней точке снял ее, когда вызвал object.wait(). Шаблон кода, похожий на поведение:

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

Обновление

При просмотре трассировки стека выясняется, что вы используете EJB-компоненты Entity и, учитывая способ работы таких реализаций, блокировки обычно создаются для EJB-объектов. Это на самом деле зависит от стратегии параллелизма , используемой для управления параллельными транзакциями, которые должны обращаться к базе данных. Я подозреваю, что число bean-компонентов либо слишком мало, либо есть только один bean-объект для блокировки.

1 голос
/ 15 июня 2011

Найдите «Блокировка снята» на этой странице, и это дает довольно хорошее объяснение того, что происходит в рамках логики ожидания на объекте.

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

Похоже, чтоэто сообщение представляет, когда исходный вызов wait (), который получает метод notify (), повторно захватывает блокировку объекта.

Для дальнейшего использования я нашел это, просто выполнив поиск в Google по запросу «Блокировка снята при ожидании», и это былопервая страница, которая появилась ... надеюсь, вы уже провели поиск в сети и просто не были удовлетворены тем, что нашли, и в этом случае извините, если это не поможет.

0 голосов
/ 15 июня 2011

Скорее всего, это относится к записи двумя строками выше:

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

wait () снимет блокировку, удерживаемую в данный момент (блокировку удерживает окружающий синхронизированный блок), и ожидает сигнала notify ().

...