Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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 迭代多线程列表而不同步整个进程_Java_Multithreading_List_Iterator_Synchronization - Fatal编程技术网

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

Java 迭代多线程列表而不同步整个进程,java,multithreading,list,iterator,synchronization,Java,Multithreading,List,Iterator,Synchronization,我有多线程代码和一个数组,所有线程都应该访问它,只有一个可以修改它(添加、删除……)或修改其中的对象 我需要一种安全的方式让线程访问它。。 我读过锁互斥同步、同步列表、copyonwritearraylist和volatile 将会有很多迭代,所以我不能像这样将synchronized放在循环之外: synchronized (list) { Iterator i = list.iterator(); //Must be in synchronized block   whi

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

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

synchronized (list) {
    Iterator i = list.iterator();
    //Must be in synchronized block
    while (i.hasNext())
        foo(i.next());
}
因为我将失去多线程的优势,我的列表大小可能会达到1000左右,所以在迭代所有这些项目时,我无法锁定整个列表

我也读过CopyOnWriteArrayList,它适用于列表用于迭代而不被修改的情况


那么,对于我这样的情况,最好的解决方案是什么呢?CopyOnWriteArrayList实际上可能就是您想要的。它允许您在某个时间点对列表的快照进行迭代。它可能与现在的列表不同,但您真的需要它吗

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


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

注意:我建议使用空格(但实际上是一个编辑器,可以在按制表键时自动缩进和添加空格),而不是制表符。它还使复制到更容易。因此,您的情况需要高并发性,但也需要迭代所有对象列表。老实说,你必须设计你的程序,使它可以并发。事实上,我们只知道你需要迭代一个列表,所以我们只能建议你这么做。你有更多的读,写,还是两者都有?我更多的是从设计的角度而不是从Java实现的角度来看待它。应该注意(从Java文档中):“这通常成本太高,但在遍历操作的数量远远超过变异的数量时,可能比其他方法更有效”@Kevin我真的很困惑,你能用一个例子来解释你的答案吗?这样我就可以理解我应该如何使用这个模式。关于我已经给你的例子和解释,你还不明白什么?