Frage

Stellen Sie sich ein Erzeuger-Verbraucher-Szenario, Gewinde A erzeugt Einträge, einer zu vielen anderen Threads verbrauchen sie.

Für das ich ein paar Einträge zu jedem Verbraucher Thread vorbei.

Tu das frage ich mich, ob es billiger ist (primär in Richtung der CPU utlization, sekundären Speicher):

  • jeder Verbraucher, um eine separate Instanz eines HashMap fädeln. den Map einen Verbraucher, eine neue Instanz der Map Nach dem Passieren wird zum Durchlassen der nächsten erzeugten Einträge in den nächsten Thread
  • erstellt und verwendete

oder

  • eine einzige ConcurrentHashMap zu verwenden und eine Iterator für jeden Verbraucher Threads erstellen und nach der Iterator zum Fadendurchleiten der Map Clearing -., So dass jeder Iterator enthält seine eigene Ansicht des zugrundeliegenden Map

Was denken Sie? Ist ein mehr oder weniger generische Antwort möglich?
Oder ist es stark abhängig von einigen Variablen wie Anzahl der Einträge, Fäden usw.?
EDIT:? oder sollte ich eine andere Art von Datenstruktur verwenden, die besser, diese Art von Problemen lösen kann

War es hilfreich?

Lösung

Das Java gleichzeitige Paket stellt eine Datenstruktur für genau dieses Szenario.

@see java.util.concurrent.BlockingDeque

Aber bitte etwas Perfomance-Test machen: weil die Ergebnisse hängen stongly auf Sie Fall verwenden. Und , wenn diese nur Mikro-Optimierung ist, als ein:. Sauber, leicht zu verstehen, würde Thread speichern Ansatz besser viel als Performance-Optimierung whithout Auswirkungen

Andere Tipps

Das teuerste, was CPU-weise ist Fäden Anstoß. Scheint, Ihr erster Ansatz keine Behauptung überhaupt produzieren - jeder Thread ist es von Karte lokale Version haben wird -. Auf Kosten der höheren Speicherverbrauch
Ich würde zum einem Benchmark zwei Szenarien für verschiedene Setups (nr von Threads, Größen Karte, usw.) des Sinn. Es ist schwer, genaue Zahlen ohne Benchmark zu erzählen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top