2015-08-05 14 views
8

ho creato un'istanza Subject in RxJava e chiamare il onNext() da più thread:È SerializedSubject necessaria per thread-sicurezza in RxJava

PublishSubject<String> subject = PublishSubject.create(); 
//... 
subject.onNext("A"); //thread A 
subject.onNext("B"); //thread B 

Il RxJava documentation dice che:

fare attenzione a non chiamare il suo metodo onNext( ) (o il suo altro sui metodi) da più thread, in quanto ciò potrebbe portare a chiamate non serializzate, che violano il contratto Observable e crea un'ambiguità nel risultante Subject.

  • Devo chiamare toSerialized() su tale Subject assumendo Non mi importa se "A" va prima o dopo "B"? Come potrebbe aiutare la serializzazione?
  • È Subject thread-safe in ogni caso o interromperò RxJava senza toSerialized()?
  • Che cos'è il "Contratto osservabile" che la documentazione menziona?

risposta

7

Devo chiamare toSerialized() in tale Soggetto assumendo Non mi importa se "A" va prima o dopo "B"?

Sì uso toSerialized() poiché tutti gli operatori applicati al soggetto presuppongono che la corretta serializzazione si verifichi a monte. Il flusso potrebbe non riuscire o produrre risultati imprevisti se ciò non avviene.

È soggetto thread-safe in ogni caso o interromperò RxJava senza toSerialized()?

risposto sopra

Qual è il "contratto osservabile" che la documentazione parla?

Rx Design Guidelines.pdf sezione 4 definisce il contratto Osservabile. Penso che la documentazione RxJava dovrebbe renderlo più rilevabile, quindi solleverò un problema.

2

Secondo la risposta di Dave, se si sa anticipo che il soggetto sta per essere accessibile da diversi thread, si potrebbe avvolgere in una SerializedSubject http://reactivex.io/RxJava/javadoc/rx/subjects/SerializedSubject.html

avvolge di un soggetto in modo che sia al sicuro chiamare i suoi vari sui metodi da diversi thread.

come: private final Subject<Object, Object> bus = new SerializedSubject<Object, Object>(PublishSubject.create());

(tratto da EventBus esempio di Ben Christensen qui: http://bl.ocks.org/benjchristensen/04eef9ca0851f3a5d7bf)

+4

questo è quello che .toSerialized() fa ... –

+0

Quando un'occhiata al codice sorgente: 'SerializedSubject public final toSerialized() { se (getClass() == SerializedSubject.class) { ritorno (SerializedSubject ) questo; } return new SerializedSubject (this); } Nuovo un SerializedSubject invece di utilizzare toSerialized() impedirà di creare nuove istanze non necessarie in memoria, quindi questa risposta è ancora migliore. – superuser

Problemi correlati