什么更便宜:遍历使用单个ConcurrentHashMap的n个迭代器或HashMap的n个实例

时间:2011-01-18 10:37:20

标签: java multithreading algorithm concurrency concurrenthashmap

想象一下生产者 - 消费者场景,线程A生成条目,一个到多个其他线程使用它们。

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

这样做我问自己它是否更便宜(主要是cpu utlization,内存中的次要):

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

  • 使用单个ConcurrentHashMap并为每个使用者线程创建Iterator并在将Iterator传递给清除Map的线程后 - 以便每个Iterator包含其自己对基础Map
  • 的看法
你怎么看?是否可能有一个或多或少的通用答案? 或者它是否强烈依赖于一些变量,如条目数,线程数等? 编辑:或者我应该使用其他类型的数据结构来解决这些问题吗?

2 个答案:

答案 0 :(得分:5)

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

@see java.util.concurrent.BlockingDeque

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

答案 1 :(得分:0)

cpu-wise最昂贵的是线程争用。似乎,你的第一种方法根本不会产生任何争用 - 每个线程都会有它的本地版本的Map - 以牺牲更高的内存消耗为代价。
举个例子,我会针对几个设置(线程数,地图大小等)的两个场景进行基准测试。没有基准就很难说清楚确切的数据。