【问题标题】:Share data between two threads in java在java中的两个线程之间共享数据
【发布时间】:2015-09-08 01:33:04
【问题描述】:

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

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

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

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

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

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

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

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

你的解决方案是什么?

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

【问题讨论】:

  • 您能先发布您的解决方案吗?
  • 抱歉,我无法发布我的代码,因为它是我公司的财产。
  • “你的解决方案是什么?”那要看。你有什么问题?您的问题描述了程序的要求。我的解决方案是编写程序。你可以说得更详细点吗? (即,向我们展示一些不符合您预期的代码,描述您的预期,然后我们可以从那里继续。)

标签: java multithreading performance optimization data-sharing


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多