我在使用兩個線程的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