JAVA多线程—并发集合

java.util.concurrent包下的并发集合

java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ConcurrentSkipListMap
java.util.concurrent.CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArraySet
java.util.concurrent.ConcurrentSkipListSet

先演示一下不使用并发集合的问题

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionModifyExceptionTest {
    public static void main(String[] args) {

        Collection<String> strs =  new ArrayList<String>();

        strs.add("LiuPeiFeng");
        strs.add("WenTing");
        strs.add("SongShenYangPian");

        Iterator<String> itrUsers = strs.iterator();

        String strFlag = "LiuPeiFeng";

        while (itrUsers.hasNext()) {
            System.out.println("aaaa");
            String str = itrUsers.next();
            if (strFlag.equals(str)) {
                strs.remove(str); // 此处如果调用的是Iterator对象的remove()方法就不会报错了
            } else {
                System.out.println(str);
            }
        }
    }
}

strFlag = “SongShenYangPian”的运行结果:
这里写图片描述

strFlag = “WenTing”的运行结果:
这里写图片描述

strFlag = “LiuPeiFeng”的运行结果:
这里写图片描述

对运行结果的解释:

通过查看源码可以发现有这样一行代码

这里写图片描述

在查看Javadoc对他的解释

这里写图片描述

大概意思是说:这个字段是用来计算集合被修改的次数的,当调用iterator()方法时会执行expectedModCount = modCount;
这里写图片描述
当修改集合(add、remove方法)时执行modCount++;,此时expectedModCount != modCount;,当调用next()方法时会调用checkForComodification();方法这里写图片描述
此时就会抛出异常了。

在以上代码中如果调用Iterator对象的remove()方法就不会报错。
Iterator对象的remove()方法的实现如下:
这里写图片描述

所以换用并发集合,不会发生这样的问题

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;

public class CollectionModifyExceptionTest {
    public static void main(String[] args) {

        //Collection<String> strs =  new ArrayList<String>();
        Collection<String> strs =  new CopyOnWriteArrayList<String>();

        strs.add("LiuPeiFeng");
        strs.add("WenTing");
        strs.add("SongShenYangPian");

        Iterator<String> itrUsers = strs.iterator();

        String strFlag = "LiuPeiFeng";

        while (itrUsers.hasNext()) {
            System.out.println("aaaa");
            String str = itrUsers.next();
            if (strFlag.equals(str)) {
                strs.remove(str); // 此处如果调用的是Iterator对象的remove()方法就不会报错了
            } else {
                System.out.println(str);
            }
        }
    }
}

strFlag = “LiuPeiFeng”;时运行结果如下:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值