2013-09-29 8 views
9

È questo il codice thread-safe?RxJava thread-safety

Observable<String> observable = ... // some observable that calls 
            // onNext from a background thread 

observable 
    .scan(new ArrayList<String>(), (List<String> acc, String next) -> { 
    acc.add(next); 
    return acc; 
    }) 
    .subscribe(list -> { 
    // do somethind with sequence of lists 
    ... 
    }); 

Sono curioso perché ArrayList non è una struttura di dati thread-safe.

+0

Le linee guida di progettazione Rx sono utili: http://go.microsoft.com/fwlink/?LinkID=205219. –

+0

Possibile duplicato di [È necessario SerializedSubject per thread-safety in RxJava] (http://stackoverflow.com/questions/31841809/is-serializedsubject-necessi-for-thread-safety-in-rxjava) –

risposta

6

Come risposta rapida, in .NET (l'implementazione Rx originale) tutti i valori di una sequenza osservabile possono essere considerati sequenziali. Questo non preclude che sia multi-thread. Tuttavia, se si producono valori in modalità multi-thread, è possibile applicare la natura sequenziale cercando la funzione equivalente all'operatore .NET Synchronize() Rx.

Un'altra opzione è controllare l'implementazione di Scan nel codice sorgente RxJava, per verificare che faccia rispettare la natura sequenziale che si vorrebbe/prevedi di fornire sicurezza nella funzione accumulatore.

+0

'scan' in RxJava fa esattamente la stessa cosa della versione originale di .Net. – allprog

+0

Cheers. Principalmente dico che col passare del tempo non posso essere sicuro che le basi di codice .NET e Java saranno le stesse. –

4

Se questo codice non è thread-safe, allora RxJava è rotto o la tua origine Observable è rotta - gli operatori non rientranti rientrano nel contratto Rx.

+0

E questo potrebbe essere applicato con l'operatore osservatore 'Checked()' di Rx, se RxJava lo ha effettivamente implementato. Richiesta pull, chiunque? –

+0

La sicurezza del filo per i blocchi non è così semplice secondo me. Nel codice mostrato nel post non contiene molti dettagli. Immagino che @orionll non abbia notato che la sottoscrizione viene consegnata in modo sincrono per impostazione predefinita. Ma se è stato convertito in una sottoscrizione asincrona, l'accesso alla lista di array non sarebbe più sicuro. – allprog

+1

@allprog Hai ragione nel dire che non è così semplice, ma questo è uno dei vantaggi di Rx, perché fa il lavoro dietro le quinte per renderlo sicuro. –