Sie können diesen Kollektor wie jeden anderen Kollektor verwenden, der in der Klasse Collectors
bereitgestellt wird, ohne befürchten zu müssen, dass Probleme mit Parallelität auftreten. Die Collector
muss sich nicht um die Fadensicherheit kümmern, es sei denn, sie hat die CONCURRENT
Eigenschaft. Es muss nur operationsfrei, staatenlos und assoziativ sein. Der Rest wird von der Stream-Pipeline selbst erledigt. Die Collector-Funktionen werden so verwendet, dass keine zusätzliche Synchronisation erforderlich ist. Insbesondere wenn accumulator
oder combiner
Funktion aufgerufen wird, ist garantiert, dass kein anderer Thread im Moment auf dem gleichen akkumulierten Wert arbeitet. Dies ist in Collector Dokumentation angegeben:
Bibliotheken, die Kürzungs basierend auf Collector
, wie Stream.collect(Collector)
, müssen die folgenden Einschränkungen beachten:
< ...>
- Für nicht Gleichzeitige Kollektoren, jedes Ergebnis, das von den Ergebnislieferanten-, Akkumulator- oder Kombiniererfunktionen zurückgegeben wird, muss seriell beschränkt sein. Dadurch kann die Erfassung parallel erfolgen, ohne dass die
Collector
eine zusätzliche Synchronisierung implementieren muss. Die Reduzierungsimplementierung muss verwalten, dass die Eingabe ordnungsgemäß partitioniert ist, dass Partitionen isoliert verarbeitet werden und das Kombinieren erst dann erfolgt, wenn die Akkumulation abgeschlossen ist.
Beachten Sie, dass der Kollektor selbst als Funktionen auch staatenlos ist es bietet, so ist es auch sicher es in dem statischen Feld zu haben. Der Zustand bleibt im externen Akkumulator erhalten, der von supplier
zurückgegeben und an accumulator
, combiner
und finisher
zurückgegeben wird. Selbst wenn der gleiche Kollektor von mehreren Stream-Operationen wiederverwendet wird, stören sie nicht.
Von was ich erinnere, ist es nicht Sammler Verantwortung für die Thread-Sicherheit. Collectors bietet einfach eine Möglichkeit zu erklären, wo * zu sammeln, aber es ist Stream, die behandelt * wenn * zu sammeln (was auch Thread-Safe sein sollte). – Pshemo
@Pshemo In diesem Fall verwenden mehrere Streams denselben gemeinsamen Collector. – assylias
@Pshemo Blick auf die Implementierung sieht aus wie es würde funktionieren - ich weiß nicht, ob es spezifisch für diesen Sammler ist oder ob es ein abgeleitetes Ergebnis ihrer Thread-Sicherheit ist. – assylias