什么是fail-fast和fail-safe?

简介: 本章讲解了什么是fail-fast和fail-safe,以及如何解决

一、fail-fast解释

fail-fastJava集合的一种错误机制。当多个线程对同一个集合进行操作时,就有可能会产生fast-fail事件。例如:当线程a正通过iterator遍历集合时,另一个线程b修改了集合的内容,此时modCount(记录集合操作过程的修改次数)会加1,不等于expectedModCount,那么线程a访问集合的时候,就会抛ConcurrentModificationException,产生fast-fail事件。边遍历边修改集合也会产生fast-fail事件。

二、解决方法:

  • 使用Colletions.synchronizedList方法或在修改集合内容的地方加上synchronized。这样的话,增删集合内容的同步锁会阻塞遍历操作,影响性能。
  • 使用CopyOnWriteArrayList来替换ArrayList。在对CopyOnWriteArrayList进行修改操作的时候,会拷贝一个新的数组,对新的数组进行操作,操作完成后再把引用移到新的数组。

三. 什么是fail safe?

采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception

缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的

相关文章
|
SQL 存储 负载均衡
MySQL实战 主从同步(原理+实战)
MySQL实战 主从同步(原理+实战)
MySQL实战 主从同步(原理+实战)
|
移动开发 Java
java发送post请求,使用multipart/form-data的方式传递参数
java发送post请求,使用multipart/form-data的方式传递参数
1977 0
|
存储 NoSQL 数据处理
《MongoDB玩转复杂数据结构:嵌套文档、数组、对象,一篇让你彻底解锁!》
【8月更文挑战第24天】MongoDB是一款支持复杂数据结构处理的面向文档的NoSQL数据库。它允许使用嵌套文档、数组及对象等灵活的数据模型。例如,一个“公司”文档可以包含多个部门文档,每个部门下又有员工列表;或者创建包含多个产品的数组,以及包含街道、城市等信息的对象。MongoDB还提供强大的查询和更新功能,能够轻松地定位并修改这些复杂结构中的数据,从而极大地提高数据处理和分析的效率。
441 1
|
11月前
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
2772 7
|
10月前
|
负载均衡 监控 安全
HTTP代理IP的安全与稳定技术与策略的结合
随着科技与互联网的发展,企业对代理的需求日益增长。为加强HTTP代理IP的安全性和稳定性,可采取用户教育、使用加密协议、定期更换IP、监控可用性、设置访问控制、负载均衡、配置防火墙及定期更新维护等措施。这些方法能有效提升代理服务的安全性和可靠性。
202 7
|
12月前
|
存储 安全 Java
代码审查:从 ArrayList 说线程安全
我们在编码和做代码审查的过程中,要对涉及到多线程使用的场景时刻绷着一根弦,将隐患拒之门外。
158 4
|
设计模式
SpringMVC常见组件之DataBinder数据绑定器分析
SpringMVC常见组件之DataBinder数据绑定器分析
571 0
|
人工智能 程序员 开发工具
通义灵码入职阿里云后,同事们的工作发生了哪些改变?
通义灵码入职阿里云云原生团队后,已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天,阿里云后端工程师云徊将从项目开发的实际需求出发,演示通义灵码在开发工作中可提供的帮助。
274 0
|
存储 Java 网络架构
Spring Boot中如何实现批量处理
Spring Boot中如何实现批量处理
|
SQL 开发框架 .NET
基于Web的养老院管理系统的设计与实现(论文+源码)_kaic
基于Web的养老院管理系统的设计与实现(论文+源码)_kaic