Код: Выделить всё
public Mono process(MyClass myclass) {
return doSomething(myclass)
.flatMap(result -> doSomethingElse(result, myclass))
.onErrorResume(throwable -> {
myclass.setErrors(toErrors(throwable)); // errors field does not have volatile modifier
return someFallback;
})
.flatMap(result -> postprocess(result, myclass));
}
Насколько я понимаю, несмотря на последовательные операции в конвейере, существует потенциальный риск: изменения, внесенные в объект в одном потоке, могут быть не сразу видны другому потоку из-за отсутствия надлежащих барьеров памяти или механизмов синхронизации. Это может привести к проблемам, которые трудно обнаружить и воспроизвести.
Однако мне не удалось воспроизвести проблему. Это может быть связано с современными оптимизациями JVM и механизмами согласованности кэша (проверено на Apple Silicon и процессоре Intel) или с тем, что я ошибаюсь в своем понимании.
Вопросы:
- Правильно ли я понимаю потенциальные проблемы видимости в реактивных конвейерах? И если да:
- Может ли кто-нибудь предоставить рабочий пример, демонстрирующий эту проблему видимости с энергонезависимыми полями (со строго последовательными этапами)?
Подробнее здесь: https://stackoverflow.com/questions/793 ... -pipelines