我需要一个LinkedHashMap的数据结构,并且是线程安全的.
我怎样才能做到这一点 ?
我的程序被阻止了,我用jstack命令分析,下面的线程拿了锁"0x0000000603f02ae0",其他线程无法获取锁.
我等了至少一个小时,但线程没有解锁,我的问题是为什么thread'state正在运行,并停在java.util.HashMap.getEntry(HashMap.java:347)?它是oracle(sun)JDK的bug?
我的jdk版本:
java版"1.6.0_21"
Java(TM)SE运行时环境(版本1.6.0_21-b06)
Java HotSpot(TM)64位服务器VM(版本17.0-b16,混合模式)
线程信息:
"PandoraScheduleTrigger-thread-5"prio = 10 tid = 0x00000000443b0800 nid = 0x5804 runnable [0x0000000043722000] java.lang.Thread.State:java中的java.util.HashMap.getEntry(HashMap.java:347)的RUNNABLE com.youlongqingfeng.pandora.context.ArmiesContext._getArmy(ArmiesContext.java:239)的com.youlongqingfeng.pandora.context.ArmiesContext.getArmiesByCityId(ArmiesContext.java:169)中的.util.HashMap.containsKey(HashMap.java:335) )com.youlongqingfeng.pandora.model.Code.Cand.Fand.Model.City上com.youlongqingfeng.pandora.model.City.calculateMemoryResource(City.java:4636)的com.youlongqingfeng.pandora.model.City.getTotalApplianceMap(City.java:4519). buildTaskFinish(City.java:1089)at com.youlongqingfeng.pandora.map.unit.ZhouMapResourceUnit.buildTaskFinish(ZhouMapResourceUnit.java:1618) - 已锁定<0x0000000603f02ae0>(com.youlongqingfeng.pandora.map.unit.ZhouMapResourceUnit),位于com.youlongqingfeng.gameserver.utils.threadpool.CancelTrigger的com.youlongqingfeng.pandora.trigger.BuildTrigger.innerRun(BuildTrigger.java:39).运行(CancelTrigger.java:34)
被阻止的线程转储:
"PandoraScheduleTrigger-thread-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.ZhouMapResourceUnit) at com.youlongqingfeng.pandora.trigger.ArmyGroupArrivedTrigger.innerRun(ArmyGroupArrivedTrigger.java:53) at com.youlongqingfeng.gameserver.utils.threadpool.CancelTrigger.run(CancelTrigger.java:34) at 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) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:207) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619)
谢谢.