Pra*_*eek 96 java iterator terminology
Java中有两种类型的迭代器:故障安全和故障快速.
这是什么意思,它们之间的区别是什么?
Ste*_*n C 81
他们之间有什么区别......
"失败安全"意味着:它不会失败.严格地说,Java中没有像故障安全迭代器那样的东西.正确的术语是"弱一致".javadoc说:
"大多数并发Collection实现(包括大多数队列)也与通常的java.util约定不同,因为它们的迭代器和Spliterator提供弱一致而不是快速失败的遍历."
通常,弱一致性意味着如果集合与迭代同时修改,则迭代所看到的保证较弱.(详细信息将在每个并发集合类javadocs中指定.)
"快速失败"意味着:它可能会失败......并且会严重检查故障情况,以便在损坏发生之前检测到故障情况(如果可能的话1).在Java中,一个失败快速的迭代器失败了.ConcurrentModificationException
"失败快速"和"弱一致"的替代方案是迭代失败不可预测的语义; 例如,有时给出错误的答案或抛出一个完全出乎意料的例外.(这是EnumerationJava早期版本中API 的一些标准实现的行为.)
......它们与我们用于收集的迭代器不同.
不.这些是由标准Collection类型实现的迭代器的属性 ; 即它们要么是"快速失败"或"弱一致" ......相对于同步和Java内存模型正确使用1.
快速失败的迭代器通常使用volatile集合对象上的计数器实现.
Iterator被创建时,计数器的当前值被嵌入Iterator对象.Iterator执行操作时,该方法比较两个计数器值并且如果它们不同则抛出CME.故障安全迭代器的实现通常是轻量级的.它们通常依赖于特定列表实现的数据结构的属性.没有一般模式.(阅读您感兴趣的特定集合类的源代码.)
1 - 骑手是快速失败行为假定应用程序在同步和内存模型方面正确.这意味着(例如)如果在ArrayList没有正确同步的情况下迭代,则最终结果可能是损坏的列表结果."快速失败"机制可能会检测到并发修改(尽管不能保证),但它不会检测到底层的损坏.作为一个例子,javadoc中的Vector.iterator()这样说:
"迭代器的快速失败行为无法得到保证,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬性保证.快速失败的迭代器会
ConcurrentModificationException尽力而为.因此,它将是编写依赖于此异常的程序以确保其正确性是错误的:迭代器的故障快速行为应仅用于检测错误."
Evg*_*eev 40
它们是相当快速失败和弱一致的类型:
来自java.util包抛出的迭代器,ConcurrentModificationException如果在迭代时通过集合的方法(添加/删除)修改了集合
java.util.concurrent包中的迭代器通常迭代快照并允许并发修改,但在创建迭代器后可能无法反映集合更新.
Jun*_*san 22
唯一的区别是故障安全迭代器不会抛出任何异常,与故障快速迭代器相反.
如果Collection在结构上被修改,而一个线程正在迭代它.这是因为它们可以克隆Collection而不是原始集合,因此它们被称为故障安全迭代器.
CopyOnWriteArrayList的迭代器是一个故障安全Iterator的示例,也是由ConcurrentHashMap写的迭代器,keySet也是故障安全迭代器,永远不会在Java中抛出ConcurrentModificationException.
| 归档时间: |
|
| 查看次数: |
87751 次 |
| 最近记录: |