之前查看ArrayList中迭代器实现源码,明白为啥通常用的迭代器在迭代的过程中不能作add和remove操作。但在支持并发数据结构的情况下,还会存在这种情况吗?
答案是不会,少见多怪了,util包中的迭代器实现是fast-failed迭代器,说白了就是一旦由修改就抛异常,在current包中迭代器是弱一致性迭代器,原来两种迭代器情况不一样。
测试代码用以ConcurrentHashMap为例,预先添加部分元素,然后启动线程不断往ConcurrentHashMap中添加元素,同时通过迭代器不断输出。此代码运行的结果是,不会抛出ConcurrentModificationException,同时添加到hashMap中的部分元素也会被迭代器迭代输出。
测试代码如下:
public class TestConcurrentHashMap {
public static void main(String[] args) {
ConcurrentHashMap<String, String> hashMap = new ConcurrentHashMap<String, String>();
for(int i=0; i< 100; i++) {
hashMap.put(""+i, ""+i);
}
Thread thread = new Thread(new Runnable() {
@Override
public void run() {