Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >rxjava2是否在线程安全上受到过度保护?

rxjava2是否在线程安全上受到过度保护?
EN

Stack Overflow用户
提问于 2018-07-27 09:03:11
回答 2查看 292关注 0票数 1

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

根据Reactive Streams specs 2.7,“订阅者必须确保其订阅上的所有调用都发生在同一线程中,或者提供各自的外部同步。”调用者不是有责任确保它的调用是线程安全的吗?

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

EN

回答 2

Stack Overflow用户

发布于 2018-07-27 09:27:12

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

在实现运算符时,必须考虑来自不同来源/消费者的各种信号类型的许多可能的并发交互。我花了很多时间研究和优化RxJava 2。并发性是很难的,我非常确定实际上没有“多余”的实现细节。总有一个原因,为什么有些算法看起来是这样的。然而,可能有一些优化的可能性,但这些都必须仔细分析和思考。

根据Reactive Streams规范2.7的

在那里,have beenare currently对规则的措辞进行了一些讨论和改进,给出了RxJava和项目反应堆等实际实现的结果。

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

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

但是我找到了"io.reactivex.internal.operators.flowable.FlowableLimit$LimitSubscriber.request“

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

票数 1
EN

Stack Overflow用户

发布于 2018-07-27 09:17:28

来自你正在使用的API的订阅对象" RXJava2“本身并不是线程安全的,但是如果你使用的是RXJava2,你必须使它成为线程安全的。或者只使用单个线程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"A Subscriber MUST ensure that all calls on its Subscription are thread Safe"

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

但我不能回答的问题,因为可能是一些人开始更改代码,并试图使其更线程安全(位)代码演变和更改,它在文档中警告关于哪些部分还不是线程安全。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51554475

复制
相关文章
在多线程处理任务中,防止线程过度竞争
对于后台的多线程处理任务,通常采取以下几种优化措施来防止线程过度竞争导致的性能下降:
一凡sir
2023/08/24
4560
BlackBox:在不受信任的系统上保护容器安全
这篇论文使用了硬件虚拟化对容器进行隔离,从而实现了轻量化的容器隔离与安全加强。文章的核心想法并不新奇,有很多类似的工作采用了虚拟化以及VMFUNC做内存隔离。其核心的贡献点,在于能够支持未经修改Docker应用,以及对syscall的支持较为完整。由此可见,Solid的工作也是会受到PC们的青睐。
用户5166556
2023/03/18
9940
BlackBox:在不受信任的系统上保护容器安全
Python 列表是否线程安全?
Python中的列表不是线程安全的,在多线程环境下,对列表的操作可能会导致数据冲突或错误。但是,并非所有列表操作都是线程不安全的。如果操作是原子的,也就是说不能被线程调度机制打断,那么就没有问题。比如L.append(x)和L.pop()就是原子操作,所以是thread安全。如果操作不是原子的,或者涉及修改多个列表元素,那么就需要使用锁或者其他同步机制来保证线程安全。例如,Li = Lj 和 L.append(L- 1) 不是原子操作,因此它们可能会导致冲突。可以使用 dis 模块来检查操作是否是原子操作。
jackcode
2023/05/29
3850
Python 列表是否线程安全?
AutoML 是否被过度炒作?
图源:汤姆和杰瑞,第70集 —— 按键猫(1952)(译者注:直到暑假去了上海Disney,我才知道它和兔八哥、啄木鸟伍迪都和迪士尼木有关系,气气
AI研习社
2019/10/29
6660
AutoML 是否被过度炒作?
AutoML 是否被过度炒作?
汤姆和杰瑞,第70集(译者注:直到暑假去了上海Disney,我才知道它和兔八哥、啄木鸟伍迪都和迪士尼木有关系=-=)--按键猫(1952)
AI科技评论
2019/10/23
5780
AutoML 是否被过度炒作?
RxJava2 多线程
subscribeOn这个操作符指定的是Observable自身在哪个调度器上执行,而且跟调用的位置没有关系。
码客说
2019/10/22
5540
Linux下的strerror是否线程安全?
man strerror即可看到相关说明,strerror_r是线程安全的,但不带_r的strerror是非线程安全的。
一见
2019/03/14
1.3K0
Linux之线程安全(上)
用pthread_create创建一个线程,产生的线程ID存放在第一个参数之中,该线程ID和内核中的LWP不是一回事。pthread_create函数第一个参数指向一块虚拟内存单元,该内存单元的地址就是新创建线程ID,这个ID是线程库的范畴,而内核中LWP是进程调度的范畴,轻量级进程是OS调度的最小单位,需要一个数值来唯一标识该线程。 Linux并不提供真正的线程,只提供了LWP,但是程序员不关注LWP,只关注线程。因此,OS在OS与应用程序之间设计了一个原生线程库——pthread库。系统保存LWP,原生线程库可能存在多个线程,别人可以同时使用。OS只需要对内核执行流LWP进行管理,而提供给用户使用的线程接口等其他数据需要线程库自己来管理,线程库对线程的管理:先描述,再组织。 线程库实际上是一个动态库:
摘星
2023/10/15
2650
Linux之线程安全(上)
怎么在区块链上保护隐私?
编者按:在12月3日的亚太区以太坊培训和交流Meetup深圳站上,Vitalik作了《怎么在区块链上保护隐私》的演讲,谈到了区块链上四种主要的保护隐私的手段,包括环签名和零知识证明。来看看吧。 作者:Vitalik
企鹅号小编
2017/12/26
2.3K0
怎么在区块链上保护隐私?
Java static 静态方法 并发(是否线程安全)
public class TestUitl { public static User setName(User user,String name) { User u = user; u.name = name; return u; } } 如上面的代码所示,在 setName 这个static方法里面u会不会有线程安全问题呢? 答案是不确定的,为什么呢? 首先说明一点,方法属于一个程序块,只有当别人调
用户1688446
2018/05/08
4.5K0
详解 RxJava2 的线程切换原理
根据上述源码分析出流程图,这里颜色相同的代表同一对象。根据流程图看一遍源码基本流程就能理通
Android技术干货分享
2019/03/28
3.1K0
详解 RxJava2 的线程切换原理
Java多线程编程中的线程安全集合:保护数据的铁壁
Java多线程编程是现代软件开发的重要组成部分,然而,多线程环境下数据的安全性一直是一个棘手的问题。本文将探讨如何通过线程安全集合来解决这一挑战。我们将深入研究Java中的Concurrent包,介绍诸如ConcurrentHashMap、CopyOnWriteArrayList等强大的数据结构,它们为多线程应用提供了高效的数据管理方式。无论您是初学者还是有经验的开发人员,都将从本文中学到如何确保数据在多线程环境下的安全性,为您的Java多线程应用程序打造坚实的基础。
杨不易呀
2023/09/27
1970
Java多线程编程中的线程安全集合:保护数据的铁壁
线程安全是否有什么办法检测到呢?
答案就是 data race tag,go 官方早在 1.1 版本就引入了数据竞争的检测工具,我们只需要在执行测试或者是编译的时候加上 -race 的 flag 就可以开启数据竞争的检测
用户7365393
2021/10/06
4780
他们在云上更安全
疫情期间,在家办公需求暴涨,从今年1月29日开始到2月6日,腾讯会议每天都在进行资源扩容,日均扩容云主机接近1.5万台,8天总共扩容超过10万台云主机,共涉及超百万核的计算资源投入,刷新了中国云计算史上前所未有的记录。在腾讯安全打造的云原生安全体系下,腾讯会议抗住了体量扩大的压力,为千万量级的用户提供各种会议场景的安全守护。
腾讯安全
2020/09/10
8580
他们在云上更安全
Servlet实例数量到底多少,是否线程安全
通过注解或servlet声明都能控制 servlet 容器如何提供 servlet 实例。
JavaEdge
2021/12/07
3530
【译】在正确的线程上观察
尽管很多人了解RxJava的基本逻辑,但是在Observable链和操作符究竟运行在哪个线程,仍然会有许多困惑。
用户1740424
2018/07/23
5150
【译】在正确的线程上观察
在 Ubuntu 20.04 上使用 Let’s Encrypt 保护 Apache
Let’s Encrypt 是一个免费的,自动的,开放证书供应商。它由提供免费 SSL 证书的 Internet Security Research Group(ISRG)开发。
雪梦科技
2020/07/14
3.3K0
在 Ubuntu 20.04 上使用 Let’s Encrypt 保护 Apache
在Ubuntu 18.04上使用Let’s Encrypt保护Nginx
Let's Encrypt是由互联网安全研究组(ISRG)开发的免费开放认证机构。 Let's Encrypt颁发的证书现在几乎所有浏览器都信任。
星哥玩云
2022/07/13
1.3K0
在Ubuntu 18.04上使用Let’s Encrypt保护Nginx
点击加载更多

相似问题

与Blazor结合使用的Razor页面是否安全,不会受到过度绑定/过度发布/大量绑定攻击?

136

我的代码是否受到保护

51

我是否受到SQL注入的保护?

11

找出youtube视频是否受到GEMA保护

13

套接字是否应该受到保护

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文