2010-08-07 2 views
3

моя программа была заблокирована, я использовал команду jstack для анализа, следующий поток взял блокировку «0x0000000603f02ae0», а другие потоки не смогли получить блокировку.
Я ждал хотя бы один час, но нить не разблокировалась, мой вопрос в том, почему thread_state является RUNNING и останавливается на java.util.HashMap.getEntry (HashMap.java:347)? ошибка оракула (солнца) JDK?Почему java.util.HashMap.getEntry может заблокировать мою программу?

моя версия JDK:
ява версия "1.6.0_21"
Java (TM) SE Runtime Environment (сборка 1.6.0_21-b06)
Java HotSpot (TM) 64-разрядного сервера VM (сборка 17.0- b16, смешанный режим)

Информационный поток:
"PandoraScheduleTrigger-нить-5" PRIO = 10 TID = 0x00000000443b0800 NID = 0x5804 работоспособной [0x0000000043722000] java.lang.Thread.State: Runnable в java.util .HashMap.getEntry (HashMap.java:347) at java.util.HashMap.containsKey (HashMap.java:335)на com.youlongqingfeng.pandora.context.ArmiesContext._getArmy (ArmiesContext.java:239) в com.youlongqingfeng.pandora.context.ArmiesContext.getArmiesByCityId (ArmiesContext.java:169) в com.youlongqingfeng.pandora.model. City.getTotalApplianceMap (City.java:4519) at com.youlongqingfeng.pandora.model.City.calculateMemoryResource (City.java:4636) at com.youlongqingfeng.pandora.model.City.buildTaskFinish (City.java:1089) в com.youlongqingfeng.pandora.map.unit.ZhouMapResourceUnit.buildTaskFinish (ZhouMapResourceUnit.java:1618) - заперта < 0x0000000603f02ae0> (а) com.youlongqingfeng.pandora.map.unit.ZhouMapResourceUnit в com.youlongqingfeng. pandora.trigger. BuildTrigger.innerRun (BuildTrigger.java:39) в com.youlongqingfeng.gameserver.utils.threadpool.CancelTrigger.run (CancelTrigger.java:34)

Blocked нить свалка:

«PandoraScheduleTrigger-нить-3 "PRIO = 10 TID = 0x0000000044c7c000 NID = 0x5802 ожидании входа монитора [0x0000000043520000] java.lang.Thread.State: BLOCKED (на мониторе объекта) на com.youlongqingfeng.pandora.map.unit.ZhouMapResourceUnit.armiesGroupReturnBack (ZhouMapResourceUnit. java: 2279) - Ожидание блокировки < 0x0000000603f02ae0> (a com.youlongqingfeng.pandora.map.unit.ZhouMapResourceU нит) на com.youlongqingfeng.pandora.trigger.ArmyGroupArrivedTrigger.innerRun (ArmyGroupArrivedTrigger.java:53) на com.youlongqingfeng.gameserver.utils.threadpool.CancelTrigger.run (CancelTrigger.java:34) в java.util. concurrent.Executors $ RunnableAdapter.call (Executors.java:441) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:303) at java.util.concurrent.FutureTask.run (FutureTask.java: 138) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301 (ScheduledThreadPoolExecutor.java:98) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:207) в java.util.concurrent .ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886)в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) в java.lang.Thread.run (Thread.java:619)

спасибо.

+0

Какие другие потоки выполняются одновременно - в частности, есть ли другой поток, который обращается к тому же ресурсу? –

+0

См. Http://stackoverflow.com/questions/10219724/vaadin-blocking-in-java-util-hasmap – Vadzim

ответ

3

Некоторые вещи, чтобы рассмотреть следующие вопросы:

  • вы используете HashMap, который не синхронизирована себя. синхронизируете ли вы доступ к карте в своем коде, во всех точках доступа? Если вы этого не сделали, возможно, что одновременный доступ к карте повредил внутренние данные, что привело к непредсказуемому поведению.

  • В одном потоке есть замок, другой пытается его получить. возможно ли, что у вас есть ситуация, когда задействованы 2 блокировки, когда 2 потока ждут другого, чтобы освободить блокировку, в которой они нуждаются, прежде чем они освободят тот, который они заблокировали? (Тема 1 заблокирована, ждет б + нить 2 запертой б ждет -> тупиковый.)

+1

спасибо, у меня есть ответ, потому что поток получил ReadLock, но я написал некоторые данные на карте , поэтому произошла ошибка. –

+0

Я нашел ту же ошибку в mybatis ~ getEntry только цикл forever.so – wener

+0

@PeterLee Эй, у меня очень похожая ситуация в PROD с HashMap, доступ к которой осуществляется в многопоточном процессе, где все 5 потоков блокируются 'в java. util.HashMap.getEntry (HashMap.java:480) '. Я хочу понять ваше заявление о ReadLock. Вы имеете в виду, что вы были просто 'put'ing элементами в HashMap во время чтения элементов? или у вас была реализация в вашем коде 'ReadWriteLock.readLock()' для получения элементов из карты, и ничего не было сделано для 'put'ing элемента? – vadimbog

2

Вы уверены, что нить остановка в getEntry? Состояние: runnable, так что, полагаю, он запущен? На этом шаге вы ловите jstack, это все. Я полагаю, существует какой-то бесконечный цикл под ZhouMapResourceUnit.buildTaskFinish, и блокировка никогда не выпускается.

0

Используйте Hashtable, если есть несколько потоков и HashMap, если есть только один поток.

+0

Hashtable медленный, я использую readWriteLock для его решения, спасибо. –

5

На самом деле, вы могли бы использовать ConcurrentHashMap вместо HashMap. HashMap будет работать в состоянии блока, когда разные потоки будут обращаться к карте в цикле или что-то в этом роде. Можно эффективно использовать ConcurrentHashMap. Он синхронизирован и эффективен. Он не блокирует полную карту, он просто блокирует текущее ведро, к которому обращаются.

Смежные вопросы