我在使用两个线程的Java应用程序中有一个非常奇怪的死锁。两个线程都将数据读写到共享的散列映射中。为了避免同步问题我做了同步读取和写入数据HashMap中的功能:奇怪的死锁(?)
private synchronized boolean identifiedLinksHasKey(String linkKey){
return Parser.identifiedLinks.containsKey(linkKey);
}
private synchronized void putToIdentifiedLinks(String key, TreeSet<String> aset){
Parser.identifiedLinks.put(key,aset);
}
但是,程序挂在某些时候(当我与一个单独的线程中运行它不发生)。要调试我的应用程序使用jstack它挂起后,这给了我下面的线程转储:
“线程2” PRIO = 6 TID = 0x0000000006b09800 NID = 0x78fc 可运行[0x00000000083ef000]
的java .lang.Thread.State:RUNBUILD at java.util.HashMap.put(Unknown Source) at bgp.parser.Entry。 putToIdentifiedLinks(Entry.java:297) - 锁定< 0x00000000853f2020>(一个bgp.parser.Entry) 在bgp.parser.Entry.parseTxtFile(Entry.java:141) 在bgp.parser.Entry.run( Entry.java:31)“线程1” PRIO = 6 TID = 0x0000000006b52800 NID = 0x9390 可运行的[0x00000000082ef000]
java.lang.Thread.State中:RUNNABLE 在java.util.HashMap.getEntry (Unknown Source) at java.util.HashMap.containsKey(Unknown Source) at bgp.parse r.Entry。 identifiedLinksHasKey(Entry.java:281) - 锁定< 0x00000000853f00e0>在bgp.parser.Entry.run(一个bgp.parser.Entry) 在bgp.parser.Entry.parseTxtFile(Entry.java:134) ( Entry.java:31)
它接近两个线程同时访问两个同步函数,这与同步的含义相矛盾。即使我使用对象锁也会发生同样的情况。尽管线程的状态不是BLOCKED,而是RUNNABLE,但它们表现得像阻塞一样,可能是因为它们同时访问相同的散列表。
我真的很感激,如果有人能解释我为什么会出现这种奇怪的情况。
这不是一个僵局。如果它看起来被阻塞了,那么你手边有一个不同的问题。 – 2010-11-07 16:17:20
这是真的,我只是不知道该怎么说。 – Vasilis 2010-11-07 22:08:00