gpt4 book ai didi

java - 防止 Java 中偶尔出现 ConcurrentModificationException 的最佳做法是什么?

转载 作者:行者123 更新时间:2023-11-29 09:57:45 24 4
gpt4 key购买 nike

哪个用于遍历列表或映射的代码序列可以防止 ConcurrentModificationException?我们的代码中有反复和零星的 ConcurrentModificationException。问题有 2 个原因。

  1. 另一个线程在迭代时更改列表
  2. 在循环中调用的方法正在更改列表。

问题 1 可以通过同步循环解决。但是如果像原因 2 一样在循环中调用外来代码,这就很糟糕了。

问题 2 可以通过列表或 map 的副本来解决。

这意味着列表或映射必须在循环之前复制到同步块(synchronized block)中。有更好的解决方案吗?

一些示例代码:

public void todoSomeThings( Map<Abc, Object> map ){
for( Abc abc : map.keySet() ){
abc.todoSomeThings();
}
}

最佳答案

您是否考虑过使用 java.util.concurrent 中的并发集合?很难提供比这更好的建议,老实说……我们需要更多详细信息。

需要注意的一点是,如果您有在线程之间共享的可变集合,并且可变集合暴露给您的大量代码,以至于您不知道在迭代时可能会发生什么变化,那么您 <如果可能,em>可能 会考虑更改您的设计。不可变集合通常可以让事情变得更干净,有时(但不总是)以牺牲一些性能为代价。开始时使用它们可能更难,但您可能会发现之后更容易推理您的代码。

关于java - 防止 Java 中偶尔出现 ConcurrentModificationException 的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4655352/

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