4

想象一个生产者-消费者场景,线程 A 产生条目,一对多的其他线程消耗它们。

为此,我将一堆条目传递给每个消费者线程。

这样做我问自己是否更便宜(主要是 CPU 使用,其次是内存):

  • 为每个消费者线程提供一个单独的实例HashMap。将 传递Map给一个消费者后,Map将创建一个新实例并将其用于将下一个生成的条目传递给下一个线程

或者

  • 使用单个并为每个消费者线程ConcurrentHashMap创建一个,并在将 传递给线程后清除- 以便每个 Iterator 包含其自己的底层视图。IteratorIteratorMapMap

你怎么看?一个或多或少的通用答案可能吗?
或者它是否强烈依赖于一些变量,如条目数、线程等?
编辑:或者我应该使用其他可以更好地解决这些问题的数据结构吗?

4

2 回答 2

5

java concurrent 包为这种情况提供了一个数据结构。

@看java.util.concurrent.BlockingDeque

但是请做一些性能测试:因为结果在很大程度上取决于你的用例。如果这只是微优化,那么:干净、易于理解、线程保存的方法会比性能优化好得多而没有影响。

于 2011-01-18T10:40:27.927 回答
0

cpu 方面最昂贵的事情是线程争用。似乎,您的第一种方法根本不会产生争用——每个线程都将拥有它的本地版本的 Map——但代价是更高的内存消耗。
一方面,我会为几个有意义的设置(线程数、地图大小等)对两个场景进行基准测试。没有基准就很难说出确切的数字。

于 2011-01-18T10:48:14.563 回答