gpt4 book ai didi

java - 在java中的两个线程之间共享数据

转载 作者:行者123 更新时间:2023-11-30 08:50:27 24 4
gpt4 key购买 nike

我正在寻找的是在两个不同线程之间共享数据的最佳解决方案。我已经编写了自己的解决方案,但我很想听听别人的想法。

场景如下:主线程启动 2 个不同的线程,它们同时运行。

第一个 (Reader) 必须从 InputStream 源中读取值,然后将它们存储到 java bean 对象中。

第二个(Sender),每隔 X 秒,必须从前一个 java 对象获取值并将它们发送到 Web 服务。

该场景的主要特殊性在于对象必须“实时”共享。我的意思是:

我上面提到的 InputStream 源,没有结束。 Reader 线程不停地从这个源读取,并提供用读取的新值更新共享对象的实例。发件人,每隔 x 秒,必须拍摄对象的“快照”,以便将其发送到网络服务。

出于这个原因,我认为生产者/消费者模式对我来说并不好,因为生产者线程无法产生“完整”的对象,但他只能连续更新同一个对象。

考虑到本程序必须在嵌入式平台上运行,性能和优化非常重要。

你的解决方案是什么?

-- 编辑--原谅我,我意识到场景的一个重要特征(这使得其他人已经回答的 stackoverflow 问题不适合我的目的)丢失了,我已经编辑了我的问题,包括最后一部分。

最佳答案

对于这种竞争激烈但对共享资源所做的工作很少的生产者/消费者模式,与涉及线程挂起和上下文切换的解决方案相比,使用自旋锁类型的 CAS 循环来消耗 CPU 周期通常更好,因为生产者/消费者完成的工作量很少,几乎没有时间花在访问共享资源上(在您的情况下,只是来自共享队列的推送/弹出或来自输入流的读/写)。

所以你不一定要在这里使用 Java synchronized 方法,它可能最终会重复挂起线程,然后立即唤醒它们,使重复的​​线程挂起和上下文切换成为瓶颈。

你想要一些使用较低级别原子 CAS 循环的东西,比如并发队列(大多数并发队列都是以这种方式实现的,也许只有当原子 CAS 推送/弹出成功的尝试次数超过一定数量时才可能使用线程挂起周期数)。

关于java - 在java中的两个线程之间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30982662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com