行为模式

目的:提供一种方法,以某种方式遍历对象中的各个元素,避免暴露该对象的内部表示
关键思想:把在元素之间游走的责任交给迭代器,而不是聚合对象
优点:
    1. 对于一个聚合对象,可以方便地支持多种迭代器(Map 的 keyIterator 和 valueIterator,正向遍历,反向遍历),在同一个聚合上可以有多个遍历(每次getIterator都会获取到一个迭代器);
    2. 把迭代功能从聚合类抽出,交由迭代器实现遍历功能,降低聚合类的复杂性;
    3. 遍历过程封装性良好,用户只需要知道迭代器就可以遍历,对于遍历算法的实现不需要关心;
    4. 新增聚合类和迭代器都很方便,只需要增加,不需要修改;
应用场景:遍历聚合对象
 
实现方式:

 
举个例子:
 
Iterator 可以作为 Container 的内部类
 
Iternator 的具体实现保存了遍历所在位置,每次调用 getIterator时,都会产生一个新的迭代器,该迭代器存放了当前迭代位置,避免了多线程同时遍历的影响
 
线程安全问题

提到遍历,不得不想到线程安全的问题,迭代器和集合是共生死的,一般迭代器对象都会持有一个集合对象的引用。
在遍历过程中的插入和删除操作都可能造成线程安全问题,甚至是死锁,所以设计迭代器时,有下面几个点可以考虑
 
(0)每次获取迭代器时,如果可以,最好提供一个新的迭代器,每个线程的迭代器持有不同的迭代位置
(1)有些迭代器提供了remove的功能,而JDK里默认是禁掉的,直接抛异常,如果打开的话,可以使用模数 modCount fail fast 机制
        在 next remove first 等等具体读写操作时,可以用模数保证当前集合对象没有被其他线程修改,如果模数不同,直接抛出异常
(2)CopyOnWrite iterator
 
JDK实现

各种集合都提供迭代器,甚至不止一类迭代器
 
比如 AbstractList,遍历时采用了 fail fast 机制, 提供了Itr 和 ListItr
 
interface Collection extends Iterable
interface set extends Collection
原文地址:https://www.cnblogs.com/43726581Gavin/p/9048481.html