sorry für die dämliche Frage, aber ich glaube ich bin grad wirklich zu blöd dazu:
Ich finde im Netz immer nur Beispiele für die Synchronisation von zwei Threads. Ich habe allerdings mehrere Threads, die auf das gleiche Objekt zugreifen.
Ausgangspunkt ist eine HashMap<String, HashMap>.
Der String ist eine ID, damit ich auf die verschachtelte Unter-HashMap zugreifen kann. Jeder Thread besitzt eine eigene ID und soll jeweils auf seine eigene HashMap zurückgreifen und dort seine berechneten Daten einspeichern. Rufe ich nun von jedem Thread eine Funktion auf, die die "obere" HashMap auslesen soll, kommt es u.U. dazu, dass die eine oder andere verschachtelte HashMap null ist. Das würde ich nun gerne synchroniseren.
Aber wie mache ich das?
Aufgebaut sind meine Threads so:
Java:
class calculate extendsThread{@Overridepublicvoidrun(){...//Berechne und greife auf die HashMap zu}}
Hi, dankeschön für deine Antwort.
Wo bring ich das denn aber unter? Zudem: Ich lese die HashMap ja nicht nur, sondern schreibe auch hinein. Ich möchte erreichen, dass alle anderen Threads nicht auf die HashMap zugreifen, bis der arbeitende Thread gelesen und geschrieben hat.
du musst es überall unterbringen, wo auf die Map zugegriffen wird,
oder eine
neueMap = Collections.synchronizedMap(alteMap)
verwenden
was spielt es übrigens für eine Rolle, ob 2 oder n Threads?
wie sehen denn die dir bekannten Beispiele für 2 Threads aus, wenn nicht auch mit synchronized?
was läßt dich vermuten, dass es bei 3 Threads anders ist
Danke.
Aber das habe ich jetzt auch mal gemacht, leider bringt es nicht viel:
Java:
HashMap<String,HashMap> hm =newHashMap<String,HashMap>;class calculate extendsThread{publicint nr;@Overridepublicvoidrun(){...synchronized(hm){HashMap tmp = hm.get(String.valueOf(nr));}...//tmp bearbeitensynchronized(hm){
hm.put(String.valueOf(nr), tmp);}showHashMaps();//Funktion mit einer For-Schleife, die dann alle 'Unter'-Hashmaps anzeigen soll}}...for(int i =0; i <10; i++){
calculate c =newcalculate();
c.nr = i;
c.start();}
Was mache ich falsch? Wenn ich die HashMap ausgebe, ist dort immer nur eine 'Unter'-HashMap enthalten.
Wieso fügst du tmp wieder hinzu? Wenn du das mit get raus holst, aber nicht löschst, ist das nicht nötig, weil tmp immer noch im hm enthalten bleibt.
Ich sehe nicht so ganz, wo das Problem liegt, ist es ein Thread-Problem? Vielleicht musst du während der Bearbeitung von tmp auch noch tmp synchronisieren.
Bist du sicher, dass man das nicht auch mit einer Datenstruktur lösen könnte, die nicht HashMaps von HashMaps verwendet?
jeder Thread ist sein eigenes Objekt, da pfuschen die anderen doch nicht rein,
Synchronisation ist in dem Fall auch nicht nötig,
-----
du brauchst ein Objekt, auf welches alle zugreifen, z.B.
Controller c = ..;
thread1 = new Thread(c);
thread2 = new Thread(c);
thread3 = new Thread(c);
-> alle merken sich und benutzen c
Ehrlich, so blöd wie ich kann man doch nicht sein... Es ist wirklich kein Thread-Problem, sondern lag schlicht und einfach daran, dass ich das übersehen habe... bzw. ging ich davon aus, dass ich den Inhalt und keine Referenz bekomme (das ist doch wirklich bei jeder Sprache anders). Irgendwo hatte ich dann nämlich noch ein tmp.clear(); drin und folglich hat der auch den entsprechenden Teil aus der HashMap gelöscht.
Thread kann geschlossen oder am besten gelöscht werden