Java 什么';更便宜:使用单个ConcurrentHashMap的n个迭代器或HashMap的n个实例进行遍历
设想一个生产者-消费者场景,线程a生成条目,一对多的其他线程使用它们 为此,我将向每个消费者线程传递一组条目 做到这一点我在问自己是否更便宜(主要是cpu利用率,次要是内存):Java 什么';更便宜:使用单个ConcurrentHashMap的n个迭代器或HashMap的n个实例进行遍历,java,multithreading,algorithm,concurrency,concurrenthashmap,Java,Multithreading,Algorithm,Concurrency,Concurrenthashmap,设想一个生产者-消费者场景,线程a生成条目,一对多的其他线程使用它们 为此,我将向每个消费者线程传递一组条目 做到这一点我在问自己是否更便宜(主要是cpu利用率,次要是内存): 为每个使用者线程提供一个单独的HashMap实例。将Map传递给一个使用者后,将创建Map的新实例,并用于将下一个生成的条目传递给下一个线程 或 使用单个ConcurrentHashMap并为每个使用者线程创建迭代器,并在将迭代器传递给线程后清除映射,以便每个迭代器包含其自身的底层映射视图 你觉得怎么样?是否可能
- 为每个使用者线程提供一个单独的
实例。将HashMap
传递给一个使用者后,将创建Map
的新实例,并用于将下一个生成的条目传递给下一个线程Map
- 使用单个
并为每个使用者线程创建ConcurrentHashMap
,并在将迭代器
传递给线程后清除迭代器
,以便每个迭代器包含其自身的底层映射
映射视图
或者它强烈地依赖于一些变量,如条目数、线程数等?
编辑:或者我应该使用其他类型的数据结构来更好地解决这类问题吗?java并发程序包为这种情况提供了一种数据结构 @请参见
java.util.concurrent.BlockingDeque
但是请做一些性能测试:因为结果很大程度上取决于您的用例。如果这只是一种微观优化,那么比一种:干净、易于理解、线程节省的方法要好得多,而不会影响性能优化。cpu方面最昂贵的事情是线程争用。看起来,您的第一种方法根本不会产生争用——每个线程都会有它的本地版本的Map——这是以更高的内存消耗为代价的。
首先,我会对两个场景进行测试,测试几个有意义的设置(线程数、映射大小等)。如果没有基准,很难说出准确的数字。如果可以的话,我会再给你投票支持更新。我还没有看到这样一个Java应用程序,它的这种优化级别会带来明显的不同。Java.util.concurrent.ArrayBlockingQueue也能做到这一点吗?如果没有,为什么?@MRalwasser:ArrayBlockingQueue是为这类任务设计的+1个有趣的问题
ConcurrentLinkedQueue
几乎可以做到这一点,但并不完全如此。