RxJava线程安全

时间:2013-09-29 17:55:17

标签: 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) -> {
    acc.add(next);
    return acc;
  })
  .subscribe( list -> {
    // do somethind with sequence of lists
    ...
  });

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

如果此代码不是线程安全的,则RxJava被破坏或您的Observable源被破坏 - 不可重入的运算符是Rx契约的一部分。