rxjava2在线程安全方面是否受到过度保护?

时间:2018-07-27 09:03:11

标签: multithreading thread-safety rx-java2

我已经使用RxJava2很久了。 最近,我正在研究RxJava2的源代码,试图理解它,并编写了自己的运算符实现。 我发现有很多关于线程安全的代码。但是我认为有些多余,这增加了学习的难度。

根据Reactive Streams specs 2.7“订阅者必须确保对其订阅的所有调用均来自同一线程或提供相应的外部同步。” 确保调用的对象是线程安全的不是调用者的职责吗?

但是我发现“ io.reactivex.internal.operators.flowable.FlowableLimit $ LimitSubscriber.request”此方法使用AtomicLong实现原子性。其他许多代码也这样做。为什么?

2 个答案:

答案 0 :(得分:1)

  

但是我认为有些是多余的,这增加了学习的难度。

在实施运营商时,必须考虑来自不同来源/消费者的各种信号类型的许多可能的并发交互。我花了很多时间来设计和优化RxJava2。并发非常困难,而且我敢肯定,实际上没有“多余的”实现细节。某些算法看起来总是有其原因的。但是,可能会有一些优化的可能性,但是必须仔细分析和考虑这些可能性。

  

根据反应式流规范2.7

考虑到RxJava和Project Reactor等实际实现的实现方式,have beenare currently对规则的措词进行了一些讨论和改进。

  

确保调用的对象是线程安全的不是调用者的责任吗?

在调用Publisher方法时,特定运算符的Subscriber.onXXX通常处于最佳位置,以确保线程安全。否则,Subscriber将需要更多地了解其来源或用途。

  

但是我发现“ io.reactivex.internal.operators.flowable.FlowableLimit $ LimitSubscriber.request”

有很多方法可以确保线程安全。 “同步”一词不一定表示必须使用Java关键字synchronized。 RxJava主要使用所谓的无锁算法,该算法利用了java.util.concurrent.atomic类提供的原子操作。请求管理通常是无锁原子的“客户端”。

答案 1 :(得分:0)

您正在使用“ RXJava2”的API的订阅对象本身并不是线程安全的,但是如果您使用RXJava2,则必须使其成为线程安全的。或只使用一个线程。

"A Subscriber MUST ensure that all calls on its Subscription are thread Safe"

基本上,这是一个警告,说有多个线程可能会发生奇怪的情况,当多线程遇到用“ Subscribtion”类编写的一段代码时,您应该认真考虑一下后果。

但是我无法回答这个问题,因为可能有人开始更改代码并试图使其变得更加线程安全(一点一点)代码在不断发展和变化,并在文档中警告有关哪些内容还不是线程安全的。

希望这会有所帮助。