C #: Muss ich Arraylist synchronisiert machen, wenn mehrere Threads nur er lesen
-
10-07-2019 - |
Frage
Ich verwende statische Arraylist in einer Klasse Informationen über nicht-aktualisierbaren Datenbankfelder zu speichern. Ich bin die Planung es einmal (nach Sperre in Konstruktor bewacht init Methodenaufruf) in Konstruktor zu initialisieren. Nach, dass mehrere Threads überprüfen, ob Arraylist ein Feld enthält. Muss ich diese Lesezugriff steuern in irgendeiner Weise? Zum Beispiel durch ArrayList.Synchronized Aufruf.
Lösung
Nein (und Sie sollen nicht brauchen, wenn es entweder so lange zu schaffen, wie Sie es in dem static
Konstruktor tun, , die eine implizite Multi-Thread-Sperre hat - wenn Sie nicht in der Lage sind, das zu tun, werden Sie wahrscheinlich sperren). Es gibt eine ReaderWriterLockSlim wenn Sie verwenden können, den Zugang zu kontrollieren, wenn Sie aber zu R / W-Zugang benötigen Sie enden.
Andere Tipps
Nein. Die Synchronisation wird nur für Stateful-Objekte erforderlich, wenn Ihr den Zustand gehen zu ändern.
Nein, solange Sie lesen Sie gerade an ihm haben.
Nein, sollen aber in einem ReadOnlyCollection
Einwickeln zu machen sicher, dass keiner der Fäden kann es ändern.
Edit:. Allerdings, dies zu tun, müssen Sie die Liste einen List<T>
eher als ein ArrayList
machen
Für die erste Erstellung Ihrer Liste könnte man erwägen, einen statischen Konstruktor. Dies wird nur einmal auf dem ersten Hinweis auf die Art aufgerufen werden.