假设我有一个集合input
,其中包含大约。 100000 个对象。
有一个worker线程池,每个线程池
- 获取该集合的一个元素,
- 做一些计算并
- 有时(在大约 10% 到最多 50% 的情况下,即每次运行 10000 到 50000 次之间)将它们的结果添加到
输出
集合中。
input
中的所有项都已处理后,另一个例程获取 output
并对其执行一些操作。
我需要线程池以便尽快处理输入
。 input
的每个元素都应该被恰好处理一次。
处理元素的顺序无关紧要(对于input
和output
)。 output
是只写的 - 工作人员只会在那里写,不会对 output
进行任何其他操作。
问题有两个部分,其中线程安全很重要:
- 工作线程需要确保当工作线程 A 处理
input
的某个元素时,其他工作线程会注意到它并且不会处理相同的元素。 - worker 完成对元素的处理后,应将结果添加到
output
集合中。
问题:
- 我可以安全地将哪种集合类型用于
input
集合(ConcurrentLinkedQueue?)? - 我可以为
output
集合使用普通的LinkedList
吗(如果 2 个线程试图同时向列表中添加不同的对象,是否会发生其中一个对象不会被保存) ?
最佳答案
CLQ 适用于给定您的约束的输入,在轮询 size() 以检查输入的终止时要小心:如文档中所述,它不是恒定时间操作。
对于输出,我怀疑 LinkedList 是线程安全的,即使只是为了添加。添加意味着改变头节点的状态,如果两个线程同时添加,这可能会产生问题和分离元素。
您可以使用另一个 CLQ 或 LinkedBlockingDeque 。还有一个更简单的 SynchronizedLinkedList。
关于java - 并发方法设计的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28895347/