2016-07-18 26 views
-3

Ich habe ein HashSet, das die Schlüssel einer HashMap enthält und den Inhalt der HashMap aktualisiert, indem ein neuer Schlüssel hinzugefügt wird. Nachdem ich das getan habe, möchte ich wieder den HashSet von Schlüsseln verwenden, da ich weiß, dass sie mit den Schlüsseln der HashMap auf dem Laufenden waren. Ich möchte nur sicherstellen, dass dies alles vom selben Thread erledigt wird, und dass hier keine Nebenläufigkeit stattfindet, von der ich vielleicht nichts weiß, sodass ich der HashMap befehle, den neuen Eintrag hinzuzufügen, und bevor I aktualisiert wurde habe die HashSet-Informationen verwendet, während sie veraltet sind.Erstellt die JVM Hintergrundthreads beim Aktualisieren einer HashMap, sodass ein HashSet seiner Schlüssel in einem einzelnen Thread-Programm "veraltet" sein kann?

In Code:

HashMap<String, Integer> myHashMap = new HashMap<String, Integer>(); 
HashSet<String> myHashSet = myHashMap.keySet(); 

... processing ... 

myHashMap.put(new_key, value); 

... use the **original** HashSet of keys, myHashSet ... 

Könnte die oben beschriebene Situation gegeben auftreten, dass dies der einzige Faden durch den Programmierer erstellt ist, so dass myHashMap und myHashSet nicht synchron sein würden? Ich spreche nicht über den Programmierer erstellen mehr als einen Thread - das Hauptprogramm läuft in einem einzigen Thread (siehe oben).

+1

Wenn Sie diese Frage stellen müssen, ist die ** kurze Antwort ** * ja, alles kann schief gehen * und die ** lange Antwort ** ist ** zu breit **. –

+0

Meine Frage unterscheidet sich von der, die Sie als Duplikat markiert haben. Hast du es gelesen, bevor du es markiert hast? Ich habe nur einen einzigen Thread; Ich möchte wissen, ob die JVM irgendwelche im Hintergrund erstellt, um mit der Aktualisierung der HashMap umzugehen. –

+0

Sie Frage ist auch ** unklar ** sowie eine von vielen ** Duplikate ** und ** zu breit **, denn Ihre Frage erwähnt * Nebenläufigkeit * und mehrere Threads und verwendet das Wort * Multithreading *. Wenn Sie einen einzelnen Thread haben und Sie dies fragen und nicht verstehen, dass das Duplikat die Antworten hat, die Sie benötigen, müssen Sie versuchen, etwas mehr darüber zu lesen, was Parallelität und Multithreading wirklich sind und wie die JVM tatsächlich funktioniert. Was würde Sie denken lassen, dass die JVM das tun würde, worüber Sie sich Sorgen machen? All das ist sogar ** zu weit ** als die bestehende Frage. –

Antwort

2

Nein werden sie nicht, weil der Schlüsselsatz eine Ansicht auf die tatsächlichen Schlüssel in der HashMap ist.

Vom Javadocs:

Der Satz von der Karte unterstützt wird, so dass Änderungen an der Karte in den Satz reflektiert werden, und umgekehrt.

Und Sie können das gleiche in OpenJDK's implementation of HashMap sehen.

Also für ein single-threaded Programm sollten diese immer synchron sein.

Die Java-Collections-Klassen machen intern keine Threads mit Threads, weil dies die Verwendung zu schwierig und fehleranfällig machen würde. Sie verlassen das Threading-Modell dem aufrufenden Code und stellen lediglich Garantien (oder anderweitig) bereit, welche Vorgänge Thread-sicher sind.