multithreading - rxjava2 是否在线程安全方面受到过度保护?
问题描述
我已经使用 RxJava2 很长时间了。最近在研究RxJava2的源码,试图理解它,写自己的算子实现。我发现有很多线程安全代码。但是我觉得有些是多余的,增加了学习的难度。
根据Reactive Streams 规范2.7 “订阅者必须确保对其订阅的所有调用都来自同一线程或提供相应的外部同步。”。确保其调用是线程安全的不是调用者的职责吗?
但我发现“io.reactivex.internal.operators.flowable.FlowableLimit$LimitSubscriber.request”这个方法使用 AtomicLong 来实现原子性。许多其他代码也是这样做的。为什么?
解决方案
但是我觉得有些是多余的,增加了学习的难度。
在实施运营商时,必须考虑来自不同来源/消费者的各种信号类型的许多可能的并发交互。我花了很多时间研究和优化 RxJava 2。并发性很难,我很确定实际上没有“多余的”实现细节。有些算法看起来像它们的样子总是有原因的。然而,可能有一些优化的可能性,但必须仔细分析和考虑。
根据 Reactive Streams 规范 2.7
考虑到RxJava和 Project Reactor 等实际实现的结果,已经并且目前正在对规则的措辞进行一些讨论和改进。
确保其调用是线程安全的不是调用者的职责吗?
在调用方法Publisher
时,特定的运算符通常处于确保线程安全的最佳位置。Subscriber.onXXX
否则,aSubscriber
将需要更多地了解其来源是什么或做什么。
但我发现“io.reactivex.internal.operators.flowable.FlowableLimit$LimitSubscriber.request”
有很多方法可以确保线程安全。措辞“同步”并不一定意味着synchronized
必须使用 Java 关键字。RxJava 主要使用所谓的无锁算法,利用java.util.concurrent.atomic
类提供的原子操作。请求管理通常是无锁原子的“客户端”。
推荐阅读
- java - 如何在 InfluxDB 中创建一个带有 2 个小数的浮点字段
- orientdb - 如何使用 Rest API 导出 Orient DB(2.2.x) 模式?
- amazon-web-services - 如何增加 AWS EC2 实例上的套接字数量?
- javascript - 如何检查子字符串的 CONTEXT 是否与 JavaScript 中的正则表达式匹配?
- python - 使用带有 auth 和 @ 密码的代理请求
- c# - 如何改进字谜代码并使其更快?
- python - 从依赖于其他数据的数据中获取价值
- android - gradlew app:dependencies 命令不起作用
- android - RecyclerView 项目中的 Android Spinner 问题
- workflow - Oracle 工作流消息属性作为响应