在RxJava中线程安全是否必需SerializedSubject

Joh*_*eff 10 java thread-safety rx-java

Subject在RxJava中创建了一个实例,并onNext()从多个线程调用它:

PublishSubject<String> subject = PublishSubject.create();
//...
subject.onNext("A");  //thread A
subject.onNext("B");  //thread B
Run Code Online (Sandbox Code Playgroud)

RxJava文档说:

注意不要onNext(?)从多个线程调用其方法(或其他方法),因为这可能导致非序列化调用,这违反了Observable合约并在结果中产生歧义Subject.

  • 我是否必须打电话toSerialized(),Subject假设我不关心是否"A"在之前或之后"B"?序列化将如何帮助?
  • Subject无论如何都是线程安全的还是我会在没有的情况下破坏RxJava toSerialized()
  • 文件中提到的" 可观察合同 "是什么?

Dav*_*ten 10

我是否必须在这样的主题上调用toSerialized(),假设我不关心"A"是在"B"之前还是之后?

是的,toSerialized()因为应用于主题的所有运算符都假定正在进行上游的正确序列化.如果不发生,流可能会失败或产生意外结果.

无论如何都是主题线程安全还是我会在没有toSerialized()的情况下中断RxJava?

以上回答

文件中提到的"可观察合同"是什么?

Rx Design Guidelines.pdf第4节定义了Observable合同.我认为RxJava文档应该使这更容易被发现,所以我会提出一个问题.