У меня очень странный тупик в приложении Java, которое использует два потока.Оба потока читают и записывают данные в общую хэш-карту.Чтобы избежать проблем с синхронизацией, я сделал синхронизированными функции, которые читают и записывают данные, в хэш-карту:
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" prio = 6 tid = 0x0000000006b09800 nid = 0x78fc runnable [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)
"Thread-1"prio = 6 tid = 0x0000000006b52800 nid = 0x9390 runnable [0x00000000082ef000]
java.lang.Thread.State: RUNNABLE в java.util.HashMap.getEntry (неизвестный источник) в java.util.HashMap.containsat bgp.parser.Entry. idLinksHasKey (Entry.java:281) - заблокирован <0x00000000853f00e0> (bgp.parser.Entry) в bgp.parser.Entry.parseTxtFile (Entry.java:1bgp.parser.Entry.run (Entry.java:31)
Появляется, что два потока получают доступ одновременноЭто две синхронизированные функции, что противоречит смыслу синхронизации.Та же самая ситуация случается, даже если я использую объектные блокировки.Хотя состояние потоков не ЗАБЛОКИРОВАНО, а ВЫПОЛНЕНО, они ведут себя как заблокированные, возможно, потому, что они одновременно обращаются к одной и той же хэш-карте.
Я был бы очень признателен, если бы кто-нибудь мог объяснить мне, почему происходит эта странная ситуация.