这段代码是否是线程安全的?
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
...
});
我很好奇,因为ArrayList不是一个线程安全的数据结构。
答案 0 :(得分:6)
作为一个快速回答,在.NET(原始Rx实现)中,可以假定来自可观察序列的所有值都是顺序的。这并不排除它是多线程的。但是,如果以多线程方式生成值,则可能需要通过查找.NET Synchronize()
Rx运算符的等效函数来强制执行顺序性。
另一种选择是检查RxJava源代码中Scan
的实现,以验证它是否强制执行您希望/期望为累加器函数提供安全性的顺序性。
答案 1 :(得分:4)
如果此代码不是线程安全的,则RxJava被破坏或您的Observable源被破坏 - 不可重入的运算符是Rx契约的一部分。