Iterator模式在jdk中使用较多,用来遍历集合。
在多线程情况下,使用Iterator需要注意同步性。
以vector为例说明此问题(这个问题由blogjava上的一个问题引起)
for (Iterator iter = vector.iterator(); iter.hasNext();) {
Object obj = iter.next();
}
上面代码在单线程情况下遍历vector,是没有问题的,在多线程情况下,有可能导致并发异常。
原因是:vector返回的Iterator 保存者修改次数,如果在遍历的同时,其他线程进行了增加了和删除操作,必然导致Iterator 内部的修改次数和vector的不一致,从而引发同步异常,解决方法很简单,加上同步即可:
synchronized(vector)
{
for (Iterator iter = vector.iterator(); iter.hasNext();) {
Object obj = iter.next();
}
}
由于vector本身是线程同步的,增加同步后,可以安全的遍历,但是vector变成arraylist,则仍然会出错,因为arraylist本身是线程不安全的,如果访问,需要将arraylist利用集合实用类转成同步的即可。
实际上HashMap的遍历也存在此问题。
对于上面的问题,我想大部分java开发人员都会注意到,
但是我的一个想法是,能否利用对象的自我判断特性,进行多线程程序的自动测试?这个还在构思,思考成熟了,会写出来。
分享到:
相关推荐
在Java中,Iterator接口是实现此模式的主要工具,它允许我们遍历任何集合,如ArrayList、LinkedList等,而无需知道底层数据结构的细节。 在上述描述中,提到了如何使用Iterator模式来解决在JSOM、XML、Java bean等...
`synchronized`关键字用于同步Java中的方法或代码块,确保同一时刻只有一个线程可以访问这些资源。这是实现线程安全的关键机制之一。 - **锁定机制**:当一个线程进入`synchronized`代码块时,它会获取一个锁。其他...
它们通常会有一个`iterator()`方法,返回一个实现了迭代器接口的对象。 4. **使用迭代器**:在客户端代码中,我们可以通过调用`iterator()`方法获取迭代器,然后使用`hasNext()`和`next()`遍历聚合对象的所有元素。...
当多个线程同时遍历一个集合并修改集合状态时,如果没有适当的同步控制,可能会导致迭代器抛出ConcurrentModificationException。这是因为迭代器在创建时会记住集合的“快照”,如果集合在迭代过程中被修改,迭代器...
`Iterator`提供了`hasNext()`和`next()`等方法来检查和获取下一个元素。 6. **抽象类与接口的相似性与差异**: - **相似性**:两者都可以作为其他类的模板,定义公共行为。 - **差异**: - 抽象类可以包含方法...
如果多个线程同时访问一个ArrayList实例,至少线程修改的一个列表结构,它必须保持外部同步。 (结构上的修改是指添加或删除一个或多个元件,或明确地调整大小背衬阵列的操作;仅设置元素的值不是结构修改。)这是一...
Java中,可以使用`synchronized`关键字来同步方法或代码块,确保在同一时刻只有一个线程能执行这些代码。 4. **集合API(Collection API)**: - 集合API是一系列用于操作对象集合的类和接口。它包括了如`HashSet`, ...
3. **同步(Synchronization)**:同步是多线程编程中的一个重要概念,用于控制多个线程对共享资源的访问,确保同一时间只有一个线程能访问特定资源。这样可以避免数据竞争条件(data race),防止数据的不一致性。...
关于Iterator,它是Java中的一个接口,用于遍历集合中的元素。通过调用其方法如hasNext()和next(),我们可以逐个访问集合内的对象,而无需知道底层的实现细节。 最后,我们比较了抽象类和接口。两者都是用于实现多...
如果多个线程同时访问884457282749实例,并且至少有一个线程在结构上修改列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作,或明确调整后台数组的大小;仅设置元素的值不是结构修改。...
同步是多线程环境中控制共享资源访问的一种机制,确保同一时间只有一个线程能访问特定资源。非同步的多线程应用可能导致多个线程同时修改共享对象,导致数据不一致。同步通过防止这种情况来避免数据竞争。同步可以...
Iterator是一个基本的迭代器,而ListIterator是Iterator的一个扩展,提供了额外的如向后迭代等功能。 4.5 fail-fast和fail-safe的区别是什么? fail-fast系统会在检测到错误情况时立即报告,而不会冒险继续运行,...
迭代器模式是一种行为型设计模式,它提供了一种方法顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示。这种模式的核心思想是将数据集合的遍历行为与集合本身的存储分离,这使得我们可以在不知道数据...
3. **遍历与迭代器**:为了方便对链表进行遍历,`GeneralList<T>`应实现Java的`Iterable<T>`接口,提供一个`Iterator<T>`,允许用户按顺序访问链表中的元素。 4. **性能考虑**:由于链表的插入和删除操作通常比数组...
置数组类型互相作用 这一章以一个使用泛型算法的程序设计作为开始 第 6 章介绍的iterator 迭代器 在第 12 章将进一步讨论 因为它们为泛型算法与实际容器的绑定提供了粘合剂 这一章也介绍并解释了函数对象的概念 ...