Ich habe ein Listenobjekt, auf das von mehreren Threads zugegriffen wird. Meistens ist es ein Thread, und in manchen Fällen zwei Threads, die die Liste aktualisieren. Es gibt einen bis fünf Threads, die aus dieser Liste lesen können, je nach der Anzahl der bearbeiteten Benutzeranfragen. Bei der Liste handelt es sich nicht um eine Warteschlange von auszuführenden Aufgaben, sondern um eine Liste von Domänenobjekten, die gleichzeitig abgerufen und aktualisiert werden.
Nun gibt es mehrere Möglichkeiten, den Zugriff auf diese Liste thread-sicher zu machen:
-synchronisierten Block verwenden
-Verwendung normal Schloss (d.h. Lese- und Schreiboperationen teilen sich dieselbe Sperre)
-Verwendung ReadWriteLock
-Verwendung eines der neuen ConcurrentBLABLBA Kollektionsklassen
Meine Frage:
Was ist der optimale Ansatz zu verwenden, da die kryptischen Abschnitte in der Regel nicht viele Operationen enthalten (meist nur Hinzufügen/Entfernen/Einfügen oder Holen von Elementen aus der Liste)?
Können Sie einen anderen, oben nicht aufgeführten Ansatz empfehlen?
Einige Beschränkungen
-Optimale Leistung ist entscheidend, der Speicherverbrauch nicht so sehr
-Es muss sich um eine geordnete Liste handeln (derzeit synchronisiert auf einer ArrayList ), obwohl es sich nicht um eine sortierte Liste handelt (d. h. nicht nach Comparable oder Comparator sortiert, sondern nach der Einfügereihenfolge)
-die Liste ist groß und enthält bis zu 100000 Domänenobjekte, so dass die Verwendung von CopyOnWriteArrayList nicht möglich ist
-die kiritischen Abschnitte zum Schreiben/Aktualisieren sind in der Regel sehr schnell, da sie einfaches Hinzufügen/Entfernen/Einfügen oder Ersetzen (Set) ermöglichen
-Leseoperationen werden in den meisten Fällen einen elementAt(index)-Aufruf durchführen, obwohl einige Leseoperationen eine binäre Suche oder indexOf(element) durchführen können
-keine direkte Iteration über die Liste durchgeführt wird, obwohl Operationen wie indexOf(..) die Liste durchlaufen