我正在寻找的是在两个不同线程之间共享数据的最佳解决方案。 我已经写了自己的解决方案,但我很有兴趣听听别人的想法。
场景如下: 主线程启动 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/