Ich habe eine Subject
Instanz in RxJava erstellt und rufe onNext()
von mehreren Threads auf:
Die RxJava-Dokumentation sagt Folgendes:
Achten Sie darauf, dass Sie die Methode
onNext( )
(oder die anderen Methoden) nicht aus mehreren Threads aufrufen, da dies zu nicht serialisierten Aufrufen führen könnte, die den Observable-Vertrag verletzen und eine Mehrdeutigkeit in der resultierendenSubject
verursachen.
toSerialized()
für solch eine Subject
aufrufen, vorausgesetzt, es ist mir egal, ob "A"
vor oder nach "B"
geht? Wie würde die Serialisierung helfen? Subject
thread-safe trotzdem oder werde ich RxJava ohne toSerialized()
? Muss ich toSerialized () bei einem solchen Betreff anrufen, wenn es mir egal ist, ob "A" vor oder nach "B" geht?
Verwenden Sie toSerialized()
, da alle Operatoren, die auf das Subjekt angewendet wurden, davon ausgehen, dass die korrekte Serialisierung stromaufwärts erfolgt. Der Datenstrom kann fehlschlagen oder unerwartete Ergebnisse liefern, wenn dies nicht geschieht.
Ist der Betreff trotzdem threadsicher oder bricht ich RxJava ohne toSerialized ()?
oben beantwortet
Was ist der "beobachtbare Vertrag", den die Dokumentation erwähnt?
Rx Design Guidelines.pdf In Abschnitt 4 wird der Observable-Vertrag definiert . Ich denke, RxJava Dokumentation sollte dies besser erkennbar machen, so werde ich ein Problem melden.
Laut Daves Antwort können Sie, wenn Sie vorher wissen, dass auf Ihr Thema von verschiedenen Threads aus zugegriffen wird, es in ein SerializedSubject
einbinden.
Ссылка
Umschließt einen Betreff, so dass es sicher ist, verschiedene Methoden aus verschiedenen Threads aufzurufen.
wie:
private final Subject<Object, Object> bus = new SerializedSubject<Object, Object>(PublishSubject.create());
(entnommen aus Ben Christensens EventBus-Beispiel hier: Ссылка )
Tags und Links java thread-safety rx-java