RxJava线程安全

RxJava线程安全,java,multithreading,thread-safety,rx-java,Java,Multithreading,Thread Safety,Rx Java,这段代码是线程安全的吗 Observable<String> observable = ... // some observable that calls // onNext from a background thread observable .scan(new ArrayList<String>(), (List<String> acc, String next) ->

这段代码是线程安全的吗

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
    ...
  });
Observable=…//一些可观察到的
//onNext从后台线程开始
可观察
.scan(新的ArrayList(),(列表附件,下一个字符串)->{
acc.add(下一步);
返回acc;
})
.订阅(列表->{
//用列表的顺序做一些事情
...
});

我很好奇,因为ArrayList不是一个线程安全的数据结构。

作为一个简单的回答,在.NET(最初的Rx实现)中,一个可观察序列中的所有值都可以假定为连续的。这并不排除它是多线程的。但是,如果以多线程方式生成值,则可能需要通过查找与.NET
Synchronize()
Rx运算符等效的函数来强制执行顺序性质


另一个选项是检查RxJava源代码中的
Scan
的实现,以验证它是否执行了您希望/期望在累加器函数中为您提供安全性的顺序性。

如果此代码不是线程安全的,然后要么RxJava被破坏,要么您的可观察源被破坏——不可重入的操作符是Rx契约的一部分

如果RxJava真的实现了,这可以通过Rx的
Checked()
observer操作符来实现。拉要求,有人吗?在我看来,滑轮的螺纹安全并不是那么简单。在文章中显示的代码中没有太多细节。我猜@orionll没有注意到的是,订阅在默认情况下是同步交付的。但是,如果它被转换为异步订阅,那么访问数组列表将不再安全。@allprog您是对的,这并不是那么简单,但这是Rx的优点之一,我想说的是,只要程序员能够在一个可以在全局状态下操作的块中插入任意函数,线程安全就不再是一个不知道完整上下文的可判定问题。scan的源代码表明,只要初始列表支持并发或不在全局上下文中访问,它将是安全的。但这句话只提到了那个单一的对象。如果块包含全局应用程序状态的管理,那么仅通过查看块的代码很难确定线程安全性。
scan
在RxJava中与.Net原始版本完全相同。谢谢。我主要是说,随着时间的推移,我不能确定.NET和Java代码库是否相同。Rx设计指南很有帮助:。可能重复