2010-11-19 11 views
14

Javadocs von CopyOnWriteArrayList sagtBehavior of CopyOnWriteArrayList

eine Thread-sichere Variante der Arraylist in dem alle mutative Operationen (hinzufügen, gesetzt, und so weiter), indem sie eine neue Kopie des darunterliegenden Array implementiert sind .

Ich bin jetzt verwirrt, wenn andere Threads Änderungen in dieser neuen Kopie sehen werden? Bedeutet dies, dass die Anzahl der Kopien des zugrunde liegenden Arrays der Anzahl der Mutationen der Sammlung entspricht? Wenn nicht, wann werden die Änderungen dieser einzelnen Kopien auf das zugrunde liegende Array übertragen, damit andere Threads sie sehen können?

Antwort

17

Die Idee dabei ist, dass, wenn Sie zu den CopyOnWriteArrayList hinzuzufügen oder zu entfernen, die zugrunde liegenden Array grundsätzlich mit der Modifikation kopiert wird.

Bedeutet dies, es wird Anzahl von Kopien des zugrunde liegenden Array gleich auf die Anzahl der Mutationen der Sammlung

Ja, für jeden Thread, aktualisiert die ArrayList alle anderen Threads halten Eine ältere Kopie referenziert im Wesentlichen ein anderes Array.

, wenn die Änderungen dieser einzelnen Kopien werden an zugrunde liegenden Array übertragen, so dass andere Threads sie sehen können?

Ein Array Sie zur Zeit suchen (lässt Ihre Iterator sagen) wird sich nie ändern. Wenn Sie von einem Array lesen, lesen Sie es wie zu Beginn des Lesens. Wenn sich die CopyOnWriteArrayList durch einen anderen Thread ändert, wird das Array, das Sie gerade beobachten, nicht beeinflusst.

Um die aktuellste Version wie list.iterator();

einen neuen Lese das tun, wird gesagt, diese Sammlung eine Menge Aktualisierung wird die Leistung töten. Wenn Sie versucht haben, CopyOnWriteArrayList zu sortieren, sehen Sie, dass die Liste eine UsupportedOperationException (die Sortierung wird für die Sammlung N-mal gesetzt) ​​ausgelöst wird. Sie sollten diesen Lesevorgang nur verwenden, wenn Sie mehr als 90 +% Lesevorgänge durchführen.