RxJava 的 onNext 访问资源时,否需要考虑线程安全。

2021-11-29 17:32:05 +08:00
 fanck0605

《 RxJava 反应式编程》中有提到( P7 ),按照契约 ObverseronNext 函数是不会同时被多条线程调用的,这不就意味着不存在对临界资源的争抢。那么后文(P71)又说需要保证 lambda 表达式(total::add)内访问变量的线程安全性。

如果这个资源(total 变量,如果不是 atomic 的), 只会被这一个 Obverser 访问,那么还需要考虑线程安全问题吗。

P7

p71

1610 次点击
所在节点    Java
7 条回复
shyling
2021-11-29 18:33:25 +08:00
下面的例子举的不对。。。

他的意思应该是让最好用 scan 累加结果,而不是用外部的 adder 。。。但这个例子跑起来也没问题。
shyling
2021-11-29 18:34:34 +08:00
如果 adder 不线程安全,结果也是对的。onNext 是顺序调用的
fanck0605
2021-11-29 20:13:27 +08:00
@shyling
onNext 虽然是顺序调用的, 但需不需要考虑变量不可见 (volatile 关键词) 的问题呢?

毕竟 onNext 并没有保证是在同一条线程运行。
fanck0605
2021-11-29 20:24:17 +08:00
我编写了这样的一段代码,虽然不加 volatile 结果是正确的,但是我仍然不确定 volatile 是否是必要的

![oQJzh6.md.png]( https://z3.ax1x.com/2021/11/29/oQJzh6.md.png)
chihiro2014
2021-11-30 10:07:51 +08:00
如果变量是全局的,那就需要加 volatile 。局部就不需要 @fanck0605
fanck0605
2021-12-02 19:37:59 +08:00
看了一下 JVM 的 happens-before 规则,onNext 前后好像都有内存屏障,毕竟一定用了锁或者 volatile 变量操作,所以 onNext 内访问的变量,无需加 volatile ,一定安全的。
aboutlonger
2021-12-05 22:05:01 +08:00
我猜这个契约是要开发者去遵守的,不是 rxjava 作出的保证。

即使这个资源只会被一个 Observer 访问,也是需要考虑线程安全的,因为一个 Observable 的 Scheduler 可以是一个线程池。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/818818

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX