Ich habe ein List-Objekt, auf das mehrere Threads zugreifen. Es gibt meistens einen Thread und unter bestimmten Bedingungen zwei Threads, der die Liste aktualisiert. Es gibt ein bis fünf Threads, die aus dieser Liste lesen können, abhängig von der Anzahl der Benutzeranforderungen, die verarbeitet werden. Die Liste ist keine Warteschlange für auszuführende Aufgaben, sondern eine Liste von Domänenobjekten, die gleichzeitig abgerufen und aktualisiert werden.Der beste Ansatz zur Verwendung in Java 6 für eine Liste, auf die gleichzeitig zugegriffen wird
Nun gibt es mehrere Möglichkeiten, den Zugriff auf diese Liste Thread-sicher zu machen:
-use synchronisierten Block
-use normalen Schloss (dh Lesen und Schreiben ops teilen gleiche Schloss)
-use ReadWriteLock
-Nutzung eines der neuen ConcurrentBLABLBA Sammlung Klassen
Meine Frage:
Was ist der optimale Ansatz, da die kritischen Abschnitte in der Regel nicht viele Operationen enthalten (meist nur das Hinzufügen/Entfernen/Einfügen oder das Abrufen von Elementen aus der Liste)?
Können Sie einen anderen Ansatz empfehlen, der oben nicht aufgeführt ist?
Einige Constraints
-optimale Leistung entscheidend ist, die Speichernutzung nicht so viel
-es muss eine geordnete Liste sein ( zur Zeit auf einem Arraylist synchronisieren), obwohl nicht eine sortierte Liste (dh mit nicht sortiert Comparable oder Comparator, aber nach dem Anzeigenauftrag)
-Die Liste ist groß, enthält bis zu 100000 Domain-Objekte, so dass etwas wie CopyOnWriteArrayList nicht praktikabel
-Die Schreiben/Update ciritical Abschnitte sind in der Regel sehr schnell, einfach zu tun/entfernen/einfügen oder ersetzen (setzen)
-die Leseoperationen werden in den meisten Fällen einen elementAt (index) -Aufruf ausführen, obwohl einige Leseoperationen eine binäre Suche ausführen können, oder indexOf (element) -keine direkte Iteration über die Liste erfolgt, obwohl Operation wie indexOf (..) wird die Liste durchlaufen
Ich mag die ConcurrentSkipListMap-Idee. In 90% der Fälle ist die Liste nach einem bestimmten Zeitstempel (Teil der ID jedes Domänenobjekts) sortiert, daher lohnt es sich, sie zu optimieren. Werde immer noch an die anderen 10% denken. –