Iteration über die synchronisierte Sammlung

8

Ich habe hier eine Frage zur Wiederholung von Vector gestellt, und mir wurden einige gute Lösungen vorgeschlagen. Aber ich lese über einen anderen einfacheren Weg, es zu tun. Ich würde gerne wissen, ob es eine gute Lösung ist.

%Vor%

mapItems ist eine synchronisierte Sammlung: Vector. Ist das das Iterieren über Vector sicher von ConcurrentModificationException ?

    
Shelef 15.03.2013, 17:48
quelle

6 Antworten

3

Ja, es macht es sicher von ConcurrentModificationException auf Kosten von allem, was im Wesentlichen single-threaded ist.

    
Alexander Pogrebnyak 15.03.2013 17:55
quelle
2

Ja, ich glaube, dass dies ein ConcurrentModificationException verhindert. Sie synchronisieren auf Vector . Alle Methoden in Vector , die sie modifizieren, sind auch synchronized , was bedeutet, dass sie auch für dasselbe Objekt sperren würden. Daher kann kein anderer Thread Vector ändern, während Sie darüber iterieren.

Außerdem ändern Sie die Vector nicht selbst, während Sie darüber iterieren.

    
rgettman 15.03.2013 17:58
quelle
2

Die gleichzeitige Synchronisierung der gesamten Sammlung würde eine ConcurrentModificationException nicht verhindern. Dies wirft immer noch einen CME

%Vor%     
John Vint 15.03.2013 18:25
quelle
1

Vielleicht möchten Sie einen ReadWriteLock verwenden.

Bei Prozessen, die über die Liste iterieren, ohne ihren Inhalt zu ändern, erhalten Sie eine Lesesperre für den freigegebenen ReentrantReadWriteLock. Dadurch können mehrere Threads Lesezugriff auf die Sperre haben.

Erwerben Sie für Prozesse, die die Liste ändern, die Schreibsperre für die gemeinsame Sperre. Dadurch wird verhindert, dass alle anderen Threads auf die Liste zugreifen (sogar schreibgeschützt), bis Sie die Schreibsperre aufheben.

    
Sam Barnum 15.03.2013 18:15
quelle
1
  

Ist das das Iterieren über den Vector sicher?   ConcurrentModificationException?

YES Es macht das Iterieren über Vector sicher von ConcurrentModificationException . Wenn es nicht synchronisiert ist, dann in diesem Fall, wenn Sie über verschiedene Threads auf den Vector zugreifen und einige andere Threads die Struktur verändern Vektor zu jeder Zeit nachdem der Iterator erstellt wurde, wird der Iterator ConcurrentModificationException werfen. Überlege dir, diesen Code auszuführen:

%Vor%

Auf meinem System wird folgende Ausgabe während der Ausführung angezeigt:

%Vor%

Wenn Sie andererseits den Codeblock mit Iterator für den Zugriff auf das Vector synchronisiert mit mapItems as lock machen, verhindert dies die Ausführung anderer Methoden im Zusammenhang mit Vector bis zu diesem synchronized block wird atomar abgeschlossen.

    
Vishal K 15.03.2013 18:19
quelle
0

Wenn wir innerhalb der while-Schleife eine add-Methode aufrufen, wird die Ausnahme ausgelöst.

%Vor%     
AmitG 15.03.2013 19:17
quelle