У меня очень странный тупик в приложении Java, который использует два потока. Оба потока считывают и записывают данные в общий хэш-файл. Чтобы избежать проблем синхронизации я сделал синхронизированы функции, чтения и записи данных в HashMap:Strange Deadlock (?)
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 после того, как он висит, который дал мне следующую нить дампа:
"Thread-2" Прио = 6 TID = 0x0000000006b09800 нидь = 0x78fc работоспособных [0x00000000083ef000]
Java .lang.Thread.State: RUNNABLE по адресу java.util.HashMap.put (Неизвестный источник) по адресу 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 (Неизвестно Источник) at java.util.HashMap.containsKey (Неизвестно Источник) at bgp.parse r.Entry. identifiedLinksHasKey (Entry.java:281) - заперта < 0x00000000853f00e0> (а bgp.parser.Entry) в bgp.parser.Entry.parseTxtFile (Entry.java:134) в bgp.parser.Entry.run (Entry.java:31)
Это швы, что два потока одновременно поддерживают две синхронизированные функции, что противоречит смыслу синхронизации. Такая же ситуация возникает, даже если я использую блокировки объектов. Хотя состояние потоков не BLOCKED, а RUNNABLE, они ведут себя как заблокированные, вероятно, потому, что они одновременно используют один и тот же хэш-файл.
Я был бы очень признателен, если бы кто-нибудь мог объяснить мне, почему эта странная ситуация случается.
Это не тупик. Если он заблокирован, у вас есть другая проблема. –
Это правда, я просто не знал, как это выразить. – Vasilis