2015-06-25 3 views
12

Sind java.util.stream.Collectors::joining Implementierungen Thread-sicher? Kann ich etwas wieIst Collectors.joining (",") Thread-sicher?

public final class SomeClass { 
    private static final Collector<CharSequence, ?, String> jc = Collectors.joining(","); 

    public String someMethod(List<String> someList) { 
     return someList.parallelStream().collect(jc); 
    } 
} 

ohne Angst vor Nebenläufigkeit Probleme tun?

+4

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

+1

@Pshemo In diesem Fall verwenden mehrere Streams denselben gemeinsamen Collector. – assylias

+1

@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

Antwort

11

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.

+0

große Antwort, es ist sehr generisch – voho