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

标签 java multithreading performance optimization data-sharing

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

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

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

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

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

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

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

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

你的解决方案是什么?

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

最佳答案

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

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

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

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

相关文章:

java - 如何在 Agentspeak 中获取文字的值

linux - 缓存一致性及其解决方案

MySql:让这个查询更快......有办法吗?

javascript - 创建具有大索引的 JavaScript 数组的好方法是什么?

mysql - 如何在派生表的 where 条件中使用先前联接中的字段?

java - Android Studio : unrecognized keystore entry + "android attributes not allowed here" in Manifest. xml

java - 我想根据 jpql 中的 updated_on 时间戳聚合数据,但关键字 INTERVAL 无效

Swift 3.0 线程类目标不实现选择器

java - SWT java 浏览器退格键停止工作

java - 让线程从主线程等待