zoukankan      html  css  js  c++  java
  • 集合框架—两种迭代机制

    迭代器fail-fast 机制是java集合(Collection)中的一种错误机制。

    在我们详细讨论这两种机制的区别之前,首先得先了解并发修改。

    2.什么是 fail-fast 机制?

    迭代器在遍历过程中是直接访问内部数据的,因此内部的数据在遍历的过程中无法被修改。为了保证不被修改,迭代器内部维护了一个标记 "mode" 当集合结构改变(添加删除或者修改),标记"mode"会被修改,而迭代器每次的hasNext()next()方法都会检查该"mode"是否被改变,当检测到被修改时,抛出Concurrent Modification Exception

    (迭代器的快速失败行为应该仅用于检测 bug。)

     

    。下面看看ArrayList迭代器部分的源码

    [java] view plain copy

    1.  private class Itr implements Iterator<E> {  

    2.          int cursor;  

    3.          int lastRet = -1;  

    4.          int expectedModCount = ArrayList.this.modCount;  

    5.    

    6.          public boolean hasNext() {  

    7.              return (this.cursor != ArrayList.this.size);  

    8.          }  

    9.    

    10.         public E next() {  

    11.             checkForComodification();  

    12.             /** 省略此处代码 */  

    13.         }  

    14.   

    15.         public void remove() {  

    16.             if (this.lastRet < 0)  

    17.                 throw new IllegalStateException();  

    18.             checkForComodification();  

    19.             /** 省略此处代码 */  

    20.         }  

    21.   

    22.         final void checkForComodification() {  

    23.             if (ArrayList.this.modCount == this.expectedModCount)  

    24.                 return;  

    25.             throw new ConcurrentModificationException();  

    26.         }  

    27.     }  

     

    可以看到它的标记"mode" expectedModeCount

       

    4. fail-safe机制

    fail-safe任何对集合结构的修改都会在一个复制的集合上进行修改,因此不会抛出ConcurrentModificationException

    fail-safe机制有两个问题

    1)需要复制集合,产生大量的无效对象,开销大

    2)无法保证读取的数据是目前原始数据结构中的数据。 

    6. fail-fast fail-safe 的区别

     

     

    Fail Fast Iterator

    Fail Safe Iterator

    Throw ConcurrentModification Exception

    Yes

    No

    Clone object

    No

    Yes

    Memory Overhead

    存储开销

    No

    Yes

    Examples

    HashMap,Vector,ArrayList,HashSet

    CopyOnWriteArrayList,

    ConcurrentHashMap

    并发集合类

     

    并发集合类以空间换时间的思想,和多线程局部变量ThreadLocation实现同步的思想一致

  • 相关阅读:
    spring boot + activeMq 邮件服务
    spring boot集成activeMQ
    Java做爬虫也很方便
    Go语言学习03
    MongoDB学习-->Gridfs分布式存储&DBRef关联查询
    tomcat与oracle关于8080端口的冲突
    端口号的查找处理方法
    很不错的在线Office控件:IWebOffice与SOAOffice
    SOAOffice和iWebOffice、NTKO的比较及其优势(转)
    Cannot get a connection, pool exhausted解决办法
  • 原文地址:https://www.cnblogs.com/domi22/p/8046946.html
Copyright © 2011-2022 走看看