CopyOnWriteArrayList 抛出当前修改异常

2024-01-18

我偶尔会得到一个ConcurrentModificationException当我迭代列表时。谷歌搜索告诉我,这可能是因为我在迭代它时在另一个线程中更改该列表,为了使这个问题消失,我应该使用java.util.concurrent.CopyOnWriteArrayList....

...除了我已经是了。

显然,我正在某个地方做一些非常愚蠢的事情。

有谁知道如何诱导CopyOnWriteArrayList扔一个ConcurrentModificationException?如果重要的话,我正在使用 Java 5。

Edit:由于我使用的变异器可能很重要,因此我通过两种方式修改此列表:

  • 在前面添加元素。 (list.add(0, newElement);)
  • 使用 subList 让较旧的项目从后面掉落。 (list = list.subList(0, MAX_LIST_SIZE);)

这些会引起危险信号吗?如果是这样,为什么?我的理解是,因为这些操作首先复制该内容,所以任何现有的迭代器都将指向未修改的原始版本,因此不会关心。我的知识有漏洞吗?

Edit 2:导致问题的确切代码仍然有点模糊,但我至少可以发布我看到的异常:


java.util.ConcurrentModificationException
    at java.util.concurrent.CopyOnWriteArrayList$COWSubList.checkForComodification(Unknown Source)
    at java.util.concurrent.CopyOnWriteArrayList$COWSubList.iterator(Unknown Source)
    at....

如果包含列表从其下方发生更改,则 CopyOnWriteArrayList.subLists 会抛出 ConcurrentModificationExceptions:

public class ListTest {

  private static List<int[]> intList;

  public static void main (String[] args) {
    CopyOnWriteArrayList<Integer> cowal = new CopyOnWriteArrayList<Integer>();
    cowal.add(1);
    cowal.add(2);
    cowal.add(3);

    List<Integer> sub = cowal.subList(1, 2);
    cowal.add(4);
    sub.get(0); //throws ConcurrentModificationException
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CopyOnWriteArrayList 抛出当前修改异常 的相关文章

随机推荐

  • Tranquility服务器不会向druid发送数据

    我在用着imply 2 2 3 这是我的宁静服务器配置 dataSources spec dataSchema dataSource tutorial tranquility server parser type string parseS
  • TCL 的通用字符串引用

    我正在编写一个实用程序 恰好是在 python 中 它以 TCL 脚本的形式生成输出 给定 python 中的一些任意字符串变量 不是 unicode 我想生成一个 TCL 行 例如 set s something 这将设置 TCL 变量
  • 过滤magento订单集合

    我使用以下行从 magento 加载订单集合 Load Order Collection order collection Mage getModel sales order gt getCollection 如何过滤此集合以忽略状态为 已
  • 如何通过“manage.py shell”使用交互式解释器重新加载 Django 模型模块?

    我知道如何在常规 Python 解释器会话中重新加载常规 Python 模块 这个问题记录了如何很好地做到这一点 如何卸载 重新加载 Python 模块 https stackoverflow com questions 437589 ho
  • 如何在 WiX 4 中使用 HarvestDirectory

    我尝试在 WiX 4 Preview 1 中使用 HarvestDirectory 项目元素 但发现它非常不直观 尽管我遵循文档中的面包屑 但我似乎无法让它真正执行任何明显的操作 在 WiX 3 中 我直接使用命令行工具 并且可以通过这种方
  • 在 Kotlin 中写入等于 Int.MIN_VALUE 的十六进制整数文字

    如何编写等于的十六进制整数文字Int MIN VALUE 这是 2147483648十进制 在 Kotlin 中 AFAIK 一个 Int 是 4 个字节 有时看起来像2的补码 https en wikipedia org wiki Two
  • WSO2 EMM Android 代理配置

    我正在尝试使用WSO2 EMM service 我下载了二进制文件并将其上传到我的服务器并在其中配置了 IP 地址 然后 我开始了 是的 效果很好 这是我的地址 a href https ip 94433 emm 普通管理员管理员 但是 我
  • GCC 不再实现

    我必须将此代码片段从 varargs h 更改为 stdarg h 但我不知道具体如何 ifndef lint int ll log va alist va dcl int event result LLog lp va list ap v
  • 如何访问 Windows 8.1 商店应用程序中 SubSections 内的控件?在视觉树中搜索不起作用

    我正在开发 Win8 1 应用程序 主页使用 Hub 在每个 HubSection 中 我需要从代码访问不同的控件 HubSection 的内容不是直接定义的 而是由 DataTemplate 定义的 因此 无法通过 x Name 访问内容
  • 了解 C++ 中的 fork、exec 和 wait (Linux)

    我对在 Linux 中使用这些不同类型的系统调用非常陌生 这让我很困惑 就此而言 我只是要求朝着正确的方向推动 开始 而不是要求完成 使用fork exec and wait 我已经阅读了它们 但这仍然对我的情况没有真正帮助 我要做的是以下
  • 如何循环来自生成器的 JavaScript 迭代器?

    假设我们有以下生成器 var gen function for var i 0 i lt 10 i yield i 循环迭代器的最有效方法是什么 目前我通过手动检查是否done属性设置为true or not var item iterat
  • UITextView 自动完成不是我订单的文本

    我有一个UITextView它连接到UITableView用于自动完成 问题是表格显示格式不正确 我遇到以下问题 详细信息不按顺序排列 例如 如果我按 a 它不会显示以第一个开头的单词 它会按需要显示 我的 txt 文件中有三种单词 如 A
  • C++ static_cast 运行时开销

    请参阅下面的代码 a 在这种情况下 简单继承 无虚拟成员 B df 中的静态转换是否有任何开销 无论如何 我发现类似问题的一些相互矛盾的答案 这就是我问的原因 b 我正在考虑制作const M1 funcA 中的 private 并引入新的
  • 'NSRangeException',原因:'*** -[__NSArrayM objectAtIndex:]:索引 1 超出范围 [0 .. 0]'

    在我的应用程序中 当我向其他用户发送附件 如图像和视频 时 此错误会随机出现 它会崩溃 我在用快速布洛克斯 SDK 这是错误 NSRangeException 原因 NSArrayM objectAtIndex 索引 1 超出范围 0 0
  • 迭代地反转单链表

    必须是 O n 且就地 空间复杂度为 1 下面的代码确实有效 但是有没有更简单或更好的方法 public void invert if this getHead null return if this getHead getNext nul
  • Play框架2.0.x AskTimeoutException

    我正在尝试对 Play 2 0 2 应用程序进行一些负载测试 但我不断遇到以下异常 无法调用该操作 最终出现错误 Thrown akka pattern AskTimeoutException Timed out 我在用着http blit
  • 正则表达式查找不在引号之间的逗号,引号中可能包含也可能不包含特殊字符作为引号中的第一个字符

    我有以下正则表达式来计算字符串中包含的逗号数量 其中逗号不出现在引号之间 B B 对于以下字符串 我会返回 4 a b c 我的 一点文字 e 但是 如果带引号的字符串的开头是特殊字符 则无法计算带引号的字符串结尾之前的任何内容 a b c
  • 为什么 std::condition_variable 使调度不公平?

    我正在尝试创建一个简单的池对象 我希望或多或少公平地将对一组共享资源的访问权限分配给任何需要它的线程 在 Windows 中 我通常会拥有一个互斥体数组并执行 WaitForMultipleObjects 其中 bWaitAll FALSE
  • 为什么我在运行“gem pristine --all”后不断收到这些错误

    我试着跑gem pristine all 我不断在控制台中看到这个 当我跑步时gem pristine all我明白了 Permission denied 我什至尝试做gem install对于每一个gem仍然得到这个 Ignoring b
  • CopyOnWriteArrayList 抛出当前修改异常

    我偶尔会得到一个ConcurrentModificationException当我迭代列表时 谷歌搜索告诉我 这可能是因为我在迭代它时在另一个线程中更改该列表 为了使这个问题消失 我应该使用java util concurrent Copy