Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';更便宜:使用单个ConcurrentHashMap的n个迭代器或HashMap的n个实例进行遍历_Java_Multithreading_Algorithm_Concurrency_Concurrenthashmap - Fatal编程技术网

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

Java 什么';更便宜:使用单个ConcurrentHashMap的n个迭代器或HashMap的n个实例进行遍历,java,multithreading,algorithm,concurrency,concurrenthashmap,Java,Multithreading,Algorithm,Concurrency,Concurrenthashmap,设想一个生产者-消费者场景,线程a生成条目,一对多的其他线程使用它们 为此,我将向每个消费者线程传递一组条目 做到这一点我在问自己是否更便宜(主要是cpu利用率,次要是内存): 为每个使用者线程提供一个单独的HashMap实例。将Map传递给一个使用者后,将创建Map的新实例,并用于将下一个生成的条目传递给下一个线程 或 使用单个ConcurrentHashMap并为每个使用者线程创建迭代器,并在将迭代器传递给线程后清除映射,以便每个迭代器包含其自身的底层映射视图 你觉得怎么样?是否可能

设想一个生产者-消费者场景,线程a生成条目,一对多的其他线程使用它们

为此,我将向每个消费者线程传递一组条目

做到这一点我在问自己是否更便宜(主要是cpu利用率,次要是内存):

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

  • 使用单个
    ConcurrentHashMap
    并为每个使用者线程创建
    迭代器
    ,并在将
    迭代器
    传递给线程后清除
    映射
    ,以便每个迭代器包含其自身的底层
    映射视图
你觉得怎么样?是否可能有一个大致通用的答案?
或者它强烈地依赖于一些变量,如条目数、线程数等?

编辑:或者我应该使用其他类型的数据结构来更好地解决这类问题吗?

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

@请参见
java.util.concurrent.BlockingDeque


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

cpu方面最昂贵的事情是线程争用。看起来,您的第一种方法根本不会产生争用——每个线程都会有它的本地版本的Map——这是以更高的内存消耗为代价的。

首先,我会对两个场景进行测试,测试几个有意义的设置(线程数、映射大小等)。如果没有基准,很难说出准确的数字。

如果可以的话,我会再给你投票支持更新。我还没有看到这样一个Java应用程序,它的这种优化级别会带来明显的不同。Java.util.concurrent.ArrayBlockingQueue也能做到这一点吗?如果没有,为什么?@MRalwasser:ArrayBlockingQueue是为这类任务设计的+1个有趣的问题
ConcurrentLinkedQueue
几乎可以做到这一点,但并不完全如此。