栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Iterator的ConcurrentModificationException

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Iterator的ConcurrentModificationException

您必须修改列表之一:

  1. pollKeyboard
    方法中的迭代器内部,而无需使用迭代器上的
    add
    remove
    方法;要么
  2. 在另一个线程中

因此,您的例外是预期的行为。从该文档,如果你有一个线程遍历列表:

如果在创建迭代器后的任何时间对列表进行结构修改,则除了通过迭代器自己的remove或add方法以任何方式进行修改外,迭代器都会引发ConcurrentModificationException

并且如果多个线程一次使用该列表:

请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改列表, 则必须在外部进行同步

解:

如果只有一个线程访问列表,请确保使用

entityItr.remove
add
方法来修改列表。

对于多线程情况,

Collections.synchronizedList
如果没有可用的锁定对象,则可以使用。

首先,将对列表的单个中央引用存储为:

entityList = Collections.synchronizedList(theOriginalArrayList);

然后以以下方式访问它(所有读者和作家):

synchronized (entityList) {  // Readers might do:  itr = entityList.iterator();  while (i.hasNext())    ... do stuff ...}

还有其他同步多线程访问的方法,包括将列表复制到数组(在同步块内部)并对其进行迭代以进行读取或使用

ReadWrite
锁。它们都取决于您的确切要求。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/455435.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号