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设计指南很有帮助:。可能重复