`
yeak2001
  • 浏览: 102769 次
  • 性别: 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容器的修改次数相等

相关推荐

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

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

    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....

    从零开始手写 dubbo rpc 框架-11-fail失败策略.pdf

    1. **FailFast(快速失败)**:一旦调用失败,立即抛出异常,不进行任何重试。 2. **FailOver(失败重试)**:当调用失败时,尝试在其他可用的服务实例上进行重试。在本例中,`FailOverStrategy`类展示了这种策略,...

    从零开始手写 dubbo rpc 框架-11-fail失败策略.docx

    1. **FailFast(快速失败)策略** FailFast策略是最简单的处理方式,当调用服务首次失败时,它立即抛出异常,不进行任何重试。这种策略适用于对响应时间敏感的场景,避免在已经知道调用会失败的情况下浪费更多的...

    dubbo服务学习最快速有用的资料

    - 支持多种服务容错策略,如Fail-fast(快速失败)、Fail-over(重试)、Fail-safe(安全失败)等,确保服务在异常情况下仍能正常工作。 7. **服务监控(Service Monitoring)** - 提供服务调用的统计信息,包括...

    hystrix接入.docx

    - **快速失败与恢复**:Hystrix支持快速失败机制,即在检测到服务不可用时立即返回错误结果,而不是等待超时。此外,当服务恢复时,Hystrix能够快速响应并重新启用对该服务的调用。 - **监控与报警**:Hystrix提供了...

    ArrayList.java

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

    Hystrix代码DEMO

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

    CicuitBreaker源码分析

    当断路器侦测到许多类似的错误时,它将不再访问远程服务器,或者调用其他服务,强迫以后的访问都会快速失败。这样可以防止服务器资源耗尽,避免雪崩效应的出现。断路器也可以使服务能够诊断错误是否已经修正,如果...

    85_hystrix要解决的分布式系统可用性问题以及其设计原则1

    通过引入资源隔离、快速失败与恢复、优雅降级等策略,Hystrix确保了服务的稳定性和整体系统的可用性。 1. **Hystrix的核心功能与设计原则** - **调用延迟与失败控制**:Hystrix提供了对依赖服务调用延迟的管理和...

    最详细的Dubbo资料(源码)

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

    Dubbo服务集群介绍.pptx

    2. Failfast Cluster(快速失败):这种模式下,一旦调用失败,系统会立即抛出异常,不进行重试。这通常用于幂等性的写操作,如添加新记录,因为重复执行不会改变结果。 3. Failsafe Cluster(失败安全):如果调用...

    Java实现dubbo集群容错

    Dubbo提供了一套完整的容错机制,包括Failover(失败自动切换)、Failfast(快速失败)、Failsafe(失败安全)、Fallback(失败回调)、Retry(重试)等策略。 1. Failover:这是默认的容错策略,当调用失败时,会...

    jstorm源码解析之bolt异常处理方法.docx

    快速失败通常意味着一旦检测到错误,就立即停止执行并抛出异常,以便于快速定位和解决问题。而在JStorm中,Worker的频繁重启可能会导致资源浪费和性能影响,特别是在出现大量未知异常时。 另一方面,如果设置的超时...

    精益创业启示.pdf

    精益创业是一种新的商业模式,它注重于快速试验、快速失败、快速学习和快速调整,以适应快速变化的市场环境。这种模式强调了创业者的勇敢和创新精神,鼓励他们敢于尝试新事物,敢于承担风险,并从失败中学习和改进。...

Global site tag (gtag.js) - Google Analytics