`
yeak2001
  • 浏览: 101069 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

快速失败

    博客分类:
  • java
 
阅读更多
快速失败 是指某个线程在迭代vector的时候,不允许其他线程修改该vector的内容,这样迭代器迭代出来的结果就会不准确,如用iterator迭代collection的时候,iterator就是另外起的一个线程,它去迭代collection,如果此时用collection.remove(obj)这个方法修改了collection里面的内容的时候,就会出现ConcurrentModificationException异常,这时候该迭代器就快速失败。 


好比对于方法的参数,一开始就检查其是否为 null,而不是到后面等用到的时候再检查(或者不检查),类似于这样的行为称为快速失败。

对于非并发集合来说,在其进行迭代时,若有其他线程修改了增减了集合中的内容,这个迭代会马上感知到,并且立即抛出 ConcurrentModificationException 异常,而不是迭代完成后才告诉你出错了。

转:ConcurrentModificationException主要原因及处理方法
2007年04月18日 星期三 12:57
当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行,   java.util.ConcurrentModificationException 异常也将被抛出。

  Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。

  所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

  有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.

1 import java.util.*; 
2
3 public final class MyTest 
4 { 
5     private static HashMap p_mapList = new HashMap(2); 
6     private MyTest(){} 
7     public static void init(){ 
8         // If only there are more than one element in Map, 
9         // the ConcurrentModificationException will not be
10         // thrown.
11          p_mapList.put(new String("hello"),new String("world")); 
12          p_mapList.put(new String("goto"),new String("hell")); 
13      } 
14     public static void clear() throws Exception{ 
15          Iterator pTmpKeys = null; 
16          Long pTmpKeyLong; 
17          pTmpKeys = p_mapList.keySet().iterator(); 
18          String pCurKey = null; 
19          String pCurObj = null; 
20         while(pTmpKeys.hasNext()){ 
21              pCurKey = (String) pTmpKeys.next(); 
22              pCurObj = (String) p_mapList.get(pCurKey); 
23
24              p_mapList.put(pCurKey,null); 
25             // You can not remove element in Map object directly.
26             //p_mapList.remove(pCurKey);
27             // But you can remove current element by iterator itself.
28              pTmpKeys.remove(); 
29
30              System.out.println(pCurKey + " removed."); 
31          } 
32          System.out.println(p_mapList.size() +  
33                             " entries left after iterator."); 
34          pTmpKeys = null; 
35      } 
36     public static void main(String[] args) 
37                                  throws Exception{ 
38          MyTest.init(); 
39          MyTest.clear(); 
40      } 
41 }
分享到:
评论
2 楼 Ccokone 2013-07-26  
看了一下源码,好像并不是什么独立线程~LZ你怎么看~
1 楼 xubindehao 2012-03-30  
写的不错,其实所谓的索引就是每一个itor类目维护一个修改次数。每次比较这个修改次数是否 与 list容器的修改次数相等

相关推荐

    Sigil:.NET CIL生成的快速失败的验证助手

    快速失败,验证了帮手和 。 用法 Sigil是ILGenerator的大约1对1替代品。 而不是调用ILGenerator.Emit(OpCode,...),而是调用Emit.OpCode(...)。 与ILGenerator不同,Sigil将在发出的IL中检测到错误后立即失败...

    IKResults:Result 和 AsyncResult 类提供组合和简单的快速失败或铁路逻辑

    超级简单的快速失败或面向铁路的编程(为什么 swift 应该拥有所有闪亮的东西?;))。 IKResults 提供了两个非常简单的类来帮助处理代码的同步和异步流。 它们不仅提高了可读性,而且让您可以轻松地推理其他复杂的...

    abort-mission:轻量级的Java库,为测试组提供灵活的测试中止支持,以允许快速失败

    Abort-Mission是一个轻量级的Java库,为测试组提供灵活的测试中止支持,以允许快速失败。这是什么意思? 提供一种将测试分组的方法让您定义测试的某些先决条件跟踪每个组如何成功或失败使用收集的数据来防止预计已...

    promise-all-soft-fail:此功能非常类似于Promise.all(),但它不会快速失败。 它执行所有的承诺并返回结果

    此功能非常类似于Promise.all(),但它不会快速失败。 它执行所有的诺言并返回结果。 let promiseAllSoftFail = require('promise-all-soft-fail').promiseAllSoftFail; promiseAllSoftFail([Promise.resolve...

    solr-express:Solr的简单轻量级查询.NET库,采用可控,可构建且快速失败的方式

    用于Solr的简单,轻量级查询.NET库,采用可控,可构建且快速失败的方式。 提供者 此项目中包含Solr4和Solr5提供程序的源。 提供者 包裹名字 稳定( master分支) Solr4 SolrExpress.Solr4 Solr5 SolrExpress....

    opossum:Node.js断路器-快速失败

    当事情开始失败时, opossum死了并且很快失败。 如果需要,可以提供故障状态时要执行的后备功能。 有关断路器模式的更多信息,网络上有很多资源-搜索它! 福勒的博客文章是地方。 项目信息 执照: 阿帕奇2.0 ...

    ArrayList.java

    此类的返回的迭代器 iterator和listIterator方法是快速失败的 :如果列表在任何时间从结构上修改创建迭代器之后,以任何方式,除了通过迭代器自身的remove或add方法,迭代器都将抛出ConcurrentModificationException...

    Hystrix代码DEMO

    熔断机制:当失败率达到阀值自动触发降级(如因网络故障、超时造成的失败率真高),熔断器触发的快速失败会进行快速恢复。 降级机制:超时降级、资源不足时(线程或信号量)降级 、运行异常降级等,降级后可以配合...

    最详细的Dubbo资料(源码)

    智能容错:Dubbo 提供了多种容错机制,包括失败自动切换、失败重试、失败快速失败等,可以根据实际需求灵活配置。 负载均衡:Dubbo 支持多种负载均衡策略,如随机、最少活跃调用等,可以根据应用场景选择合适的负载...

    一种快速预判FPGA布线失败的方法.pdf

    一种快速预判FPGA布线失败的方法.pdf

    springcloud-alibaba-demo-8-9.zip

    Failfast Cluster:快速失败。当服务调用失败后,立即报错,也就是指发起一次调用。(这种模式通常用于写操作,这种模式可以防止网络等问题导致数据重复新增,它等同于Failover Cluster retries=0) Failsafe Cluster...

    电子产品快速瞬变脉冲群测试的失败原因及对策分析

    本资源描述电子产品快速瞬变脉冲群测试的失败原因及对策分析!

    JDKAPI18CN(中文版)

    The iterators returned by this class's个 iterator和listIterator方法是快速失败的 :如果列表在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身remove种或add方法,迭代器都将抛出一个...

    strom的安装

    Nimbus和Supervisor都能快速失败并恢复,而且它们是无状态的,其元数据存储在ZooKeeper中,这使得系统具有很高的容错性。Nimbus与Supervisor之间的协调工作是通过ZooKeeper来完成的。 Worker由Supervisor负责启动,...

    Java工程师面试复习指南

    【Java工程师面试复习指南】本仓库架构大部分Java工程师所需要掌握的核心知识,整合了互联网上的很...Java集合详解:迭代器,快速失败机制与比较器 Java集合详解:HashMap和HashTable Java集合详解:深入理解LinkedHas

    Keithley2400-吉时利2400数字源表中文说明书

    吉时利数字源表系列特别适用于需要精密电压源和电流源驱动,同时进行电流与电压测量的测试应用...内置快速失败/通过测试比较器 可选式接触检查功能 数字I/O提供快速分选与机械手连接 GPIB, RS-232, 和触发式连接面板

    漫谈大数据第四期-storm

    Nimbus和Supervisor都能快速失败,而且是无 状态的,这样一来它们就变得十分健壮,两者的协调工作是由ApacheZooKeeper来完成的。 Storm的术语包括Stream、Spout、Bolt、Task、Worker、Stream Grouping和Topology。...

    CSFB失败问题快速定位手册.pdf

    CSFB失败问题快速定位手册.pdf

    Result, 快速型模拟任意操作的成功/失败.zip

    Result, 快速型模拟任意操作的成功/失败 结果 Result, Error> 值要么是成功的( 包装 Value ) 要么是失败的( 包装 Error ) 。 这与 swift Optional 类型的本机类似: success 就像 s

    promise-all-forgiving:没有失败快速行为的Promise.all()

    承诺全部宽恕Promise.all()具有快速失败的行为,这意味着,如果任何promise Promise.all()拒绝,则Promise.all()将被拒绝。 有时您不希望这种行为发生,而这就是承诺无限宽容的体现。如果一个或多个承诺被拒绝,它将...

Global site tag (gtag.js) - Google Analytics