2016-07-13 9 views
0

Ich brauche eine gleichzeitige Liste, die Thread-sicher ist und zur gleichen Zeit am besten für Iteration ist und genaue Größe zurückgeben sollte. Ich möchte Auktionsgebote für einen Artikel speichern. Deshalb möchte ichConcurrent LinkedList vs ConcurrentLinkedQueue

  1. abrufen, die genaue Zahl der Gebote für einen Artikel
  2. fügen Sie ein Gebot auf einen Artikel der Lage sein,
  3. abrufen alle Gebote für einen bestimmten Artikel.
  4. ein Gebot für einen Artikel

ich es in einem ConcurrentHashMap<Item, LinkedList<ItemBid>> zu haben bin der Planung entfernen - LinkedList ist nicht Thread-sicher aber gibt genaue Größe ConcurrentHashMap<Item, ConcurrentLinkedQueue<ItemBid>> - concurrentlinked Warteschlange Thread-sicher ist aber auf Rückkehr garantiert nicht genaue Größe

Gibt es eine andere bessere Sammlung, die die oben genannten 4 Punkte anspricht und Thread-sicher ist.

+0

Was meinst du genau mit "exakte Größe"? – bowmore

Antwort

2

Nun wohl in einer thread-sicheren Sammlung oder Karte können Sie nicht die "Konsistenz" der Größe garantieren, was bedeutet, dass die "happen-before" Beziehung zwischen Lese-und Schreibvorgänge nicht den gewünschten Anwendungsfall, wo Eine Leseoperation für die Größe sollte einen Wert zurückgeben, der den genauen Zustand der letzten Schreiboperation widerspiegelt (NB: verbessert basierend auf Kommentaren - siehe unten).

Was Sie können tun, wenn die Leistung nicht ein Problem ist folgendes Idiom zu verwenden - entweder:

  • Collections.synchronizedMap(new HashMap<YourKeyType, YourValueType>());
  • Collections.synchronizedList(new ArrayList<YourType>());

Sie werden dann müssen auch ausdrücklich auf über diese Objekte synchronisieren.

Dies stellt sicher, dass die Reihenfolge der Operationen auf Kosten der Blockierung konsistent ist, und Sie sollten immer die letzte "richtige" Größe erhalten.

+2

Die thread-sicheren Sammlungen legen _happens-before_ fest. Das ist ein wichtiger Teil dessen, was "threadsicher" bedeutet. Ich denke, was Sie sagen wollen ist, dass die Fadensicherheit nicht kompozierbar ist. Das heißt, selbst wenn jedes Objekt in Ihrer Anwendung threadsicher ist, macht das Ihren _application_ thread nicht sicher. Nur weil eine Sammlung "thread-safe" ist, wird in keiner Weise garantiert, was ein Anwendungs-Thread in die Sammlung steckt, was ein anderer Anwendungs-Thread dort erwartet. –

+0

Unter der Annahme, dass diese Sammlung Teil eines großen Auktionssystems sein wird, das Millionen von Geboten pro Tag akzeptiert, so würde die Leistung ein Problem darstellen. Die Verwendung eines Dekorators zum Synchronisieren meiner Sammlung würde die Leistung beeinträchtigen. – megan

+0

@james_large Messepunkt, vielen Dank für Ihre Klarstellung. Ich sollte dies wahrscheinlich bearbeiten, wenn ich wieder zu Hause bin :) – Mena

1

Sie können LinkedBlockingQueue verwenden. Es blockiert (wie bei der CLQ) aber Größe wird beibehalten und nicht wie der CLQ gescannt.

+0

Es ist nicht threadsafe wie in den Java-Dokumenten. – megan

+1

Ich versichere Ihnen, die 'LinkedBlockingQueue' ist sicher threadsicher. https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html Dort heißt es: 'BlockingQueue-Implementierungen sind Thread-sicher. '. –