fail-fast和fail-safe机制

1. fail-fast机制在遍历一个集合时,当集合结构被修改,很大可能会抛出Concurrent Modification Exception。fail-fast会在以下两种情况下抛出此异常:

    a)单线程情况下,在遍历集合的过程中修改了结构,比如iterator的remove方法。

    b)多线程情况下,当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。

之所以很大可能抛出异常是因为集合是根据集合内元素个数的变化判断是否抛出异常,比如HashMap的modCount。也许执行此判断时modCount还没有被修改,所以不一定抛出异常。所以尽量不要在产品代码中使用,可以用来debug。

if (modCount != expectedModCount)
   throw new ConcurrentModificationException();

具有fail-fast机制的主要集合有HashMap,Vector,ArrayList,HashSet。

 

2. fail-safe机制会把集合复制之后再进行修改,也就是说修改是在另外一个集合上进行的,因此不会抛出ConcurrentModificationException。fail-safe机制有两个结果:

    a)复制集合实例,导致占用内存堆空间。

    b)复制出来的集合实例无法保证与原实例完全相同。

具有fail-safe机制的主要集合有CopyOnWriteArrayList, ConcurrentHashMap。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值