Я работаю с базой кода, где у нас много шаблонов, похожих на:
getPoJoObservableFromSomewhere() // no guarantees about the threading/scheduling here
.doOnNext(pojo -> System.out.println("got pojo: " + pojo.toString())
.doOnNext(pojo -> pojo.setName("my new pojo"))
.observeOn(newThreadScheduler)
.flatMap(pojo -> doSomethingWithPojo(pojo)) // no guarantees about the threading/scheduling in doSomethingWithPojo()
.subscribe(pojo -> System.out.println("Got a pojo: " + pojo.toString()));
Или еще более вероятно:
Pojo myPojo = new Pojo("old name");
getNameFromSomewhere() // intentionally no guarantee what scheduler or thread this is observed on for this example
.doOnNext(pojo -> pojo.setName("new name"))
.flatMap(pojo -> doSomethingWithPojo(pojo)) // again, no guarantees about the threading inside this call
.subscribe(pojo -> (), error -> System.out.println("Error handling goes here"));
Предполагается, что объекты Pojo представляют собой обычные объекты данных без побочных эффектов, которые выглядят примерно так:
class Pojo {
private String name;
public Pojo(String name) { this.name = name; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
Безопасен ли этот шаблон от незначительных ошибок потоков?
Самое большое, что я могу вспомнить, это барьеры памяти, но я не настолько опытен, чтобы игнорировать мысль о том, что могут быть вещи, о которых я не знаю.
Например, будут ли установлены барьеры памяти для того, чтобы после мутации в вызове doOnNext()
все записи были завершены и были подхвачены тем, что происходит в doSomethingWithPojo()
внутри flatMap?
В двух словах: безопасны ли эти шаблоны?
(Наша кодовая база - RxJava 1, но этот вопрос в равной степени относится и к RxJava 2)