使用共享内存时提高程序加速

时间:2016-07-02 20:18:12

标签: java multithreading parallel-processing

我有一个从Chudnovsky公式计算Pi的程序。它是用Java编写的,它使用共享的Vector来保存中间计算,例如包含元素索引的阶乘和幂。

但是,我相信由于它是一个同步的Vector(默认情况下是线程安全的),因此只有一个线程可以读取或写入它。所以当我们有很多线程时,我们看到计算时间不变,而不是增加加速。

我能做些什么来绕过那个?当有太多线程读/写到同一共享内存时该怎么办?

4 个答案:

答案 0 :(得分:1)

将每个线程的结果存储在堆栈中。一个线程从每个线程收集结果并将它们一起添加。当然堆栈不应该是空的。

如果您希望多个线程处理阶乘,为什么不创建一个或两个产生阶乘结果列表的线程。如果需要,其他线程可以查找结果。

答案 1 :(得分:1)

当访问模式是大量读取和偶尔写入时,您可以使用ReentrantReadWriteLock保护未同步的数据结构。它允许多个读者,但只允许一个作者。

根据您的实施情况,您可能还会受益于ConcurrentHashMap

可能能够作弊并使用AtomicIntegerArrayAtomicReferenceArray Futures/CompletionStages

答案 2 :(得分:0)

不是拥有相同的共享内存,而是可以在堆栈中拥有多个具有单独内存的线程。最后,将所有这些添加到一起(或偶尔)一个线程!

答案 3 :(得分:0)

如果您需要高吞吐量,可以考虑使用Disruptor和RingBuffer。

在原始级别,您可以将Disruptor视为队列的多播图,其中生产者在其上放置对象,这些对象通过单独的下游队列发送给所有消费者以供并行使用。当你向内看时,你会看到这个队列网络实际上是一个单一的数据结构 - 一个环形缓冲区。

每个生产者和消费者都有一个序列计数器,用于指示当前正在处理的缓冲区中的哪个插槽。每个生产者/消费者编写自己的序列计数器,但可以读取其他的序列计数器

几条有用的链接:

https://lmax-exchange.github.io/disruptor

http://martinfowler.com/articles/lmax.html

https://softwareengineering.stackexchange.com/questions/244826/can-someone-explain-in-simple-terms-what-is-the-disruptor-pattern