当前位置: 首页 > 面试题库 >

快速失败的迭代器如何知道抛出“ ConcurrentModificationException”时修改了基础结构?

卢才艺
2023-03-14
问题内容

快速失败的迭代器一旦意识到自迭代开始以来就已经更改了Collection的结构,就会失败。结构更改意味着在一个线程迭代该集合时,从集合中添加,删除或更新任何元素。

但是如何知道变化呢?


问题答案:

刚刚检查了HashMap类的源代码。特别是搜索“
modCount”。例如,私有的HashIterator类保存创建实例以来实例被修改的次数(使用’remove’方法除外)。

对于“
nextEntry”方法,将检查计数以查看其是否已更改,并可能引发该异常。“删除”方法还检查计数,但是如果成功,则将计数重置为新值。这样做是为了使您可以使用’remove’方法删除条目而无需获取异常。

其他方法(例如“ clear”)将增加“ modCount”。如上面的代码摘录所示,这将导致在下次调用“ nextEntry”时引发异常。

无法保证会引发异常。

API:

http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

请注意,不能保证快速故障行为,因为通常来说,在存在不同步的并发修改的情况下,不可能做出任何严格的保证。快速失败操作会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序的正确性是错误的:ConcurrentModificationException应该仅用于检测错误。



 类似资料:
  • 1.1 安装Python (略······) 安装Python教程网上能找到很多,这里我不想手打了...... 1.2 交互式解释器 当启动Python的时候,会出现和下面相似的提示: Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:40:30) [MSC v.1500 64 bit (AMD64)] on win32 Type "help

  • 我对python和编程都是新手,所以我很迷茫。我已经编写了一个“Node”类(如下文底部所示),它实例化了一个二叉搜索树和几个方法,如insert()和elements()(通过按顺序横切树返回元素列表)。我应该使这个类是可迭代的:“iter__(self)应该返回一个NodeIterator,它按照排序顺序从树中返回元素。修改树不应该修改现有的迭代器。”我现在正试图通过在类中插入以下代码来实现这

  • 本文向大家介绍MySQL如何快速修改表的表结构,包括了MySQL如何快速修改表的表结构的使用技巧和注意事项,需要的朋友参考一下 快速修改MySQL某张表的表结构--摘录自《MySQL管理之道》 这个命令可以修改表结构 此外,也可以如下方法修改表结构: 先创建一张表,如下: 如果要修改name列为varchar(10)的,可以这样操作: 也可以如下操作: 1、查看表结构,如下: 2、创建临时表,把v

  • 问题内容: 我得到这样的定义:顾名思义,快速失败的迭代器一旦意识到 自迭代开始以来 就已经改变了Collection的结构,它就会失败。 自迭代开始以来 是什么意思?是在 Iterator it = set.iterator()之后的 这行代码的意思吗? 问题答案: 首先,它们是 快速 故障的,而不是故障 安全的 。 合同规定,对某些类型的集合进行结构修改(即插入/删除)会使集合中的现有迭代器无效

  • 本文向大家介绍ThinkPHP3.1基础知识快速入门,包括了ThinkPHP3.1基础知识快速入门的使用技巧和注意事项,需要的朋友参考一下 在当今众多的MVC框架中,ThinkPHP是一个快速、简单的基于MVC和面向对象的轻量级PHP开发框架,其遵循Apache2开源协议发布,自从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验及易用性,并且拥有众多的原创功

  • 问题内容: 我有一个包含一些键(字符串)和值(POJO)的地图 我想遍历此映射并更改POJO中的某些数据。 我继承的当前代码将删除给定的条目,并在对POJO进行一些更改后将其重新添加。 这不能很好地进行,因为在遍历地图时您不应该修改地图(方法已同步,但ConcurrentModificationException仍然出现) 我的问题是 ,如果我需要遍历地图并更改值,我可以使用的最佳实践/方法是什么