繁体   English   中英

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

[英]Share data between two threads in java

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

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

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

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

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

我上面提到的 InputStream 源,没有尽头。 Reader线程在不停止此源的情况下读取,并提供使用读取的新值更新共享对象的实例。 Sender 必须每隔 x 秒拍摄一次对象的“快照”,以便将其发送到 Web 服务。

出于这个原因,我认为生产者/消费者模式对我不利,因为生产者线程无法生成“完整”对象,而他只能不断更新相同的对象。

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

你的解决方案是什么?

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

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

因此,您不一定要在这里使用 Java 同步方法,这可能最终会重复挂起线程,然后立即唤醒它们,从而使重复的线程挂起和上下文切换成为瓶颈。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM