gpt4 book ai didi

java - 迭代多线程列表而不同步整个进程

转载 作者:行者123 更新时间:2023-11-30 03:46:24 26 4
gpt4 key购买 nike

我有多线程代码和一个数组,所有线程都应该访问它,并且只有一个数组可以修改它(添加,删除,..)或修改其中的对象我需要一种安全的方式让线程访问它..我读到了有关锁互斥同步、同步列表、copyonwritearraylist 和 volatile 的内容。

将会有很多迭代,所以我不能像这样将同步放在循环之外:

synchronized (list) {
Iterator i = list.iterator();
//Must be in synchronized block
  while (i.hasNext())
foo(i.next());
}

因为我会失去多线程的优势,而且我的列表大小可能会达到 1000 左右,所以我无法在迭代所有这些项目时锁定整个列表

我还读到过有关CopyOnWriteArrayList的内容,它适用于列表用于迭代而不被修改的情况

那么对于像我这样的情况,最好的解决方案是什么

最佳答案

CopyOnWriteArrayList 实际上可能就是您想要的。它允许您迭代列表在某个时间点存在的快照。它可能与现在的列表不同,但您真的需要它吗?

这样想吧。迭代列表的线程和修改列表的线程可以以多种方式交错它们的操作,其中没有一种是错误的。一种可能性是迭代线程可以在修改线程被安排运行之前迭代整个列表。另一种可能性是迭代线程将在修改列表之前遍历列表的一半。将更改传播到所有现有迭代器将是一项复杂且昂贵的操作,并且您必须仔细定义迭代器的功能,例如,当在其当前位置下方插入某些内容时。所有这些复杂性不会使程序变得更加正确,因为如果线程恰好以稍微不同的方式进行调度,则行为将与 CopyOnWriteArrayList 相同。

这是您在高效、高度并发的程序中经常遇到的模式。重要的是,线程正在对象的有效快照上进行操作,不一定是对象的当前版本,因为其他线程知道该版本。

关于java - 迭代多线程列表而不同步整个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25575559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com