J'ai un blocage très étrange dans une application Java qui utilise deux threads. Les deux threads lisent et écrivent des données sur un hashmap partagé. Pour éviter les problèmes de synchronisation j'ai fait les fonctions synchronisées lecture et d'écriture des données du 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);
}
Cependant, le programme se bloque à un moment donné (ce qui ne se produit pas quand je le lance avec un seul fil). Pour déboguer mon application je jstack après qu'il se bloque, ce qui m'a donné la décharge de fil suivant:
"Discussion-2" prio = 6 tid = 0x0000000006b09800 JNV = 0x78fc runnable [0x00000000083ef000]
java .lang.Thread.State: RUNNABLE à java.util.HashMap.put (source inconnue) à bgp.parser.Entry. putToIdentifiedLinks (Entry.java:297) - verrouillés < 0x00000000853f2020> (a 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 (Inconnu Source) at java.util.HashMap.containsKey (Inconnu Source) at bgp.parse r.Entry. identifiedLinksHasKey (Entry.java:281) - verrouillé < 0x00000000853f00e0> (a bgp.parser.Entry) à bgp.parser.Entry.parseTxtFile (Entry.java:134) à bgp.parser.Entry.run (Entry.java:31)
Il semble que les deux threads accèdent simultanément aux deux fonctions synchronisées ce qui contredit la signification de la synchronisation. La même situation se produit même si j'utilise des verrous d'objet. Bien que l'état des threads ne soit pas BLOQUÉ mais RUNNABLE, ils se comportent comme bloqués, probablement parce qu'ils accèdent à la même hashmap en même temps.
J'apprécierais vraiment si quelqu'un pourrait m'expliquer pourquoi cette situation étrange se produit.
ce n'est pas un interblocage. S'il apparaît bloqué, vous avez un problème différent à portée de main. –
c'est vrai, je ne savais pas comment le mettre. – Vasilis