Rx java RxJava';s可观察。订户()和#x27;s onNext回调必须使用线程安全对象吗?

Rx java RxJava';s可观察。订户()和#x27;s onNext回调必须使用线程安全对象吗?,rx-java,rx-java2,Rx Java,Rx Java2,这就是我的代码的样子: ArrayList<T> result = new ArrayList<T>(); observable.subscribe(result::add, <something here>, <something here>); ArrayList结果=新建ArrayList(); 订阅(结果::添加,); 不建议这样做吗?result应该是线程安全的结构吗 我在使用非线程安全对象时没有遇到任何问题,而且几乎没有问题。在维护

这就是我的代码的样子:

ArrayList<T> result = new ArrayList<T>();
observable.subscribe(result::add, <something here>, <something here>);
ArrayList结果=新建ArrayList();
订阅(结果::添加,);

不建议这样做吗?
result
应该是线程安全的结构吗

我在使用非线程安全对象时没有遇到任何问题,而且几乎没有问题。在维护良好的并发实践时,我建议研究RxJava的可观察性的其他方法。

了解线程安全的含义非常重要

一种类型的线程安全源于分区,即只对一个线程中的对象执行操作。在这种情况下,您处理的对象没有特殊的线程安全问题

当您使用
同步
易失性
等来确保访问和修改的串行性时,就会出现另一种类型的线程安全

在您的示例中,
result
不是线程安全的,但我们无法判断它是否被正确划分,从而使线程安全成为一个非问题。违反安全规定的例子:

  • 您的observable可能有来自不同线程的值。您需要确保您使用的是
    SerializedSubject
    或类似工具,以确保维护可观察的契约
  • 在观察者链处于活动状态时使用
    结果
    的任何代码都有导致使用不安全的风险
以下是如何划分对
结果的访问:

Scheduler myScheduler; // have a known, single-threaded scheduler.
...
List<String> result;
...
observer
  .observeOn( myScheduler )
  .subscribe( List::add, err -> {},
     () -> { // do end of processing here
   });
调度程序myScheduler;//有一个已知的单线程调度程序。
...
列出结果;
...
观察者
.observeOn(myScheduler)
.subscribe(列表::add,err->{},
()->{//在此处结束处理
});
使用
observeOn()
将确保单个线程负责向
结果添加元素

要访问结果的内容,您需要a)等待观察者链完成,这可以在
onCompleted()
处理中发出信号,或者b)您需要在与观察者链相同的线程上运行