2014-08-30 8 views
5

Say Ich habe ein Array [a, b, c, d]Warum ist CopyOnWriteArrayList sicher?

Gewinde A will ein neues Element e dem Satz hinzuzufügen. CopyOnWriteArrayList erstellt neues Array, kopiert alle Werte aus dem alten Array, fügt neues Element hinzu e und aktualisiert dann den Verweis auf das neue Array mit Element e darin.

Während Gewinde A kopiert Werte, Gewinde B auch will ein neues Element f hinzuzufügen. Es kopiert also alle Werte ohne und fügt f hinzu und aktualisiert dann den Verweis auf das Array.

In diesem Fall darf das Array nicht das Element e enthalten.

Wie wird die Fadensicherheit hier erreicht?

Antwort

9

Alle Modifizierungsmethoden (add, set, remove, clear usw.) werden durch Sperren geschützt. So haben Sie die richtige Schreibreihenfolge. Aufgrund des Kopierens beim Schreiben bedeutet dies jedoch, dass jedes der Backing-Arrays effektiv unveränderbar ist, was bedeutet, dass schreibgeschützte Operationen nicht gesperrt werden müssen. (Das Feld mit dem Hintergrundarray ist volatile, so dass Sie immer noch das richtige passiert-vor Verhalten.)