Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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_Concurrency - Fatal编程技术网

如何以线程安全的方式迭代数组列表(Java)

如何以线程安全的方式迭代数组列表(Java),java,multithreading,concurrency,Java,Multithreading,Concurrency,我在我的多线程应用程序中使用了一个数组列表,我希望有一种方法能够以某种方式遍历数组,同时在迭代时向列表中添加元素时不会引发任何异常。当我遍历数组列表时,有没有办法阻止它被修改 编辑: 我现在意识到我的问题提交得很糟糕,否决票是应该的。这是试图解决我的问题 我想做的是,在我遍历列表之前,有一些方法“阻止”列表,这样我就不会得到并发修改异常。问题是迭代将花费相当多的处理器时间来完成,因为列表将非常大,我希望对每个元素执行的操作将花费相当多的时间。如果我使用同步方法,这是一个问题,因为add方法将阻塞

我在我的多线程应用程序中使用了一个数组列表,我希望有一种方法能够以某种方式遍历数组,同时在迭代时向列表中添加元素时不会引发任何异常。当我遍历数组列表时,有没有办法阻止它被修改

编辑: 我现在意识到我的问题提交得很糟糕,否决票是应该的。这是试图解决我的问题


我想做的是,在我遍历列表之前,有一些方法“阻止”列表,这样我就不会得到并发修改异常。问题是迭代将花费相当多的处理器时间来完成,因为列表将非常大,我希望对每个元素执行的操作将花费相当多的时间。如果我使用同步方法,这是一个问题,因为add方法将阻塞大量时间并降低应用程序性能。所以我要做的是创建一个类来模拟数组列表,除了当它被“阻止”时,一个方法试图修改它,它将存储该请求,当列表被“取消阻止”时,它将在一个单独的线程中执行所有请求。问题是,当我尝试实现此策略时,我必须将请求存储在某种列表中,并遇到与以前相同的问题,在请求线程迭代请求时,必须阻止添加到请求列表的功能。我不知道如何实现这个解决方案,甚至不知道它是否正确。如果有人能帮助我,我将不胜感激。

您可以选择使用同步或使用java.util.concurrent包中提供的实现。你还需要仔细阅读这个问题。你问了一个非常基本和经典的问题,关于这个问题有很多信息。但以下是你的基本选择:

使用syncronization-veru昂贵的性能,但绝对是防弹的。在synchronizedterm中读取或在接口及其实现上读取。还有关于课堂的。请注意,此选项将对您的性能造成非常严重的瓶颈 正如其中一条评论所说,使用类。也有一些后退,但在大多数情况下是一个更好的选择,然后完全同步。
当选择2个选项时,考虑以下几点:虽然同步化是一个正确的解决方案,如果做得正确,这是一个非常繁琐的工作,需要大量的测试,这不是微不足道的。因此,这已经是一个大倒退。另外,在大多数情况下,读取超过写入次数,或者数组大小足够小,比如说多达数百个元素,这样就可以接受写时拷贝。因此,我猜大多数情况下,CopyOnWriteArrayList会更可取。问题是,在上述两个选项之间进行选择时,没有明确的答案。程序员需要考虑环境,选择更适合自己情况的选项

使用您选择的搜索引擎:java synchronized。但是,如果您还不知道这一点,您的多线程应用程序将很难实现。您对此有何想法或想法?您尝试过吗?它应该抛出ConcurrentModificationException!冲突语句:您要么希望在迭代期间出现异常,要么不希望出现异常。当某人在某处迭代时,没有办法阻止修改-它将抛出ConcurrentMod,但在迭代线程中,而不是修改线程。如果您只是希望中间修改中的并发迭代是安全的,请参阅CopyOnWriteArrayList,它可能正是您所需要的。如果不以线程安全的方式执行所有其他操作,则无法“以线程安全的方式迭代数组列表”。有不同的选项,对列表的每次访问使用同步使所有线程等待迭代完成,读写锁允许同时进行读访问,但使用起来可能更复杂。CopyOnWriteArrayList不是“最终更好的选项”。它的名字已经表明了它的巨大成本,这可能比“完全同步”要昂贵得多。此外,即使使用同步也不是“防弹”;你可以做错的事情很多。@Holger是的,只要你做了什么事情,你就可以在任何事情上做错很多事情,但如果你做对了,那就是防弹的。至于CopyOnWriteArrayList,如果读取的数量远远超过写入的数量,那么它肯定是更好的选择。如果你的数组不是太大的话。因此,程序员需要考虑环境并选择更适合其情况的选项“因此程序员需要考虑环境并选择…”听起来比粗体的“最终更好的选项”语句要好得多。你不知道读数是否远远超过wr
霍尔格合成是一项非常整洁的工作,需要进行大量的测试,这并不是一件小事。因此,这已经是一个大倒退。另外,在大多数情况下,读取超过写入次数,或者数组大小足够小,比如说多达数百个元素,这样就可以接受写时拷贝。因此,我猜大多数情况下,CopyOnWriteArrayList会更可取。最好将这些考虑因素写进你的答案中,而不是把它们记在心里,只写一个有疑问的“最终更好的选择”短语…