java - 并发方法设计的数据类型

标签 java multithreading collections concurrency

假设我有一个集合input,其中包含大约。 100000 个对象。

有一个worker线程池,每个线程池

  1. 获取该集合的一个元素,
  2. 做一些计算并
  3. 有时(在大约 10% 到最多 50% 的情况下,即每次运行 10000 到 50000 次之间)将它们的结果添加到输出集合中。

input 中的所有项都已处理后,另一个例程获取 output 并对其执行一些操作。

我需要线程池以便尽快处理输入input 的每个元素都应该被恰好处理一次。

处理元素的顺序无关紧要(对于inputoutput)。 output 是只写的 - 工作人员只会在那里写,不会对 output 进行任何其他操作。

问题有两个部分,其中线程安全很重要:

  1. 工作线程需要确保当工作线程 A 处理 input 的某个元素时,其他工作线程会注意到它并且不会处理相同的元素。
  2. worker 完成对元素的处理后,应将结果添加到output 集合中。

问题:

  1. 我可以安全地将哪种集合类型用于input 集合(ConcurrentLinkedQueue?)?
  2. 我可以为 output 集合使用普通的 LinkedList 吗(如果 2 个线程试图同时向列表中添加不同的对象,是否会发生其中一个对象不会被保存) ?

最佳答案

CLQ 适用于给定您的约束的输入,在轮询 size() 以检查输入的终止时要小心:如文档中所述,它不是恒定时间操作。

对于输出,我怀疑 LinkedList 是线程安全的,即使只是为了添加。添加意味着改变头节点的状态,如果两个线程同时添加,这可能会产生问题和分离元素。

您可以使用另一个 CLQ 或 LinkedBlockingDeque 。还有一个更简单的 SynchronizedLinkedList。

关于java - 并发方法设计的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28895347/

相关文章:

java - 初始化服务时URI不是绝对的

java - 为 eclipse-pmd 配置与 gradle PMD 使用相同的 PMD 规则集 - 哪个规则集用于 net.sourceforge.pmd :pmd-java

java - 如何通过首先搜索整个单词来进行子串?

java - java swing多线程实现简单的二维动画

scala - 如何在参数定义中限制列表的最大长度?

java - 使用 Grappa (Java PEG Parser) 匹配 OR 表达式

multithreading - 顺序一致性中的 RMW 优化

c++ - 列出线程 C++

java - 动态数组列表用于迭代对象Arraylist并根据对象名称获取结果

java - addAll() 实现——Java