Fail Fast与Fail Safe的区别

Fail Fast

Fail Fast Iterator在遍历集合时,若该集合发生了结构性的改变,则将抛出 ConcurrentModification 异常。例如:

        Map<String, String> premiumPhone = new HashMap<String, String>();
        premiumPhone.put("Apple", "iPhone");
        premiumPhone.put("HTC", "HTC one");
        premiumPhone.put("Samsung", "S5");

        Iterator<String> iterator = premiumPhone.keySet().iterator();

        while (iterator.hasNext()) {
            System.out.println(premiumPhone.get(iterator.next()));
            premiumPhone.put("Sony", "Xperia Z");
        }

如果将while循环内的语句

premiumPhone.put("Sony", "Xperia Z");

改成如下,则不会抛出ConcurrentModification 异常。因为只修改了值,没有改变集合的结构

premiumPhone.put("HTC", "Xperia Z");

Fail Fast检测集合结构改变的原理,Iterator直接访问集合的数据结构,它保留一个标志”mods”,在Iterator每次调用hasNext()或者是next()方法时,首先检测”mods”状态,如果结构已经改变,则抛出异常。

Fail Safe

Fail Safe Iterator的实现原理是,先将原集合拷贝一份,在拷贝上开展遍历,因此不会引起ConcurrentModification 异常。因此,Fail Safe Iterator存在两个缺陷:
1. 引入了额外的空间开销
2. 遍历时读取的数据,并不能保证是最新的

一个Fail Safe Iterator的例子如下:

        ConcurrentHashMap<String, String> premiumPhone = new ConcurrentHashMap<String, String>();
        premiumPhone.put("Apple", "iPhone");
        premiumPhone.put("HTC", "HTC one");
        premiumPhone.put("Samsung", "S5");

        Iterator<String> iterator = premiumPhone.keySet().iterator();

        while (iterator.hasNext()) {
            System.out.println(premiumPhone.get(iterator.next()));
            premiumPhone.put("Sony", "Xperia Z");
        }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值