在java

时间:2015-06-22 14:33:15

标签: java multithreading performance optimization data-sharing

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

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

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

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

场景的主要特点是对象必须在"实时"中共享。我的意思是:

我上面提到的InputStream源没有结束。 Reader 线程在不停止此源的情况下读取,并提供更新读取新值的共享对象实例。 每隔x秒,发件人必须拍摄一张"快照"用于将其发送到Web服务的对象。

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

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

你的解决方案是什么?

- 编辑 - 原谅我,我意识到这个场景的一个重要特征(使其他人已经回答了堆栈流问题不利于我的目的)不见了,我编辑了我的问题,包括最后一部分。

1 个答案:

答案 0 :(得分:2)

对于这种生产者/消费者模式,考虑到高争用但对共享资源的工作很少,通常使用自旋锁型CAS循环来烧制CPU周期比涉及线程暂停的解决方案更好。上下文切换,因为生产者/消费者完成的工作量很少,以至于几乎没有时间花在访问共享资源上(只是来自共享队列的推送/弹出或来自输入流的读/写)你的情况)。

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

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

相关问题