简述快速失败(fail-fast)和安全失败(fail-safe)?

简介: 快速失败(fail-fast)和安全失败(fail-safe)

快速失败(fail—fast):快速失败是Java集合的一种错误检测机制

  • 在用迭代器遍历一个集合对象时,如果线程A遍历过程中,线程B对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
  • 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
  • 注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。
  • 场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改),比如ArrayList 类。

安全失败(fail—safe)

  • 采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
  • 原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。
  • 缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
  • 场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改,比如CopyOnWriteArrayList类。
相关文章
|
NoSQL IDE 网络协议
Redis高级客户端Lettuce详解(下)
Lettuce是一个Redis的Java驱动包,初识她的时候是使用RedisTemplate的时候遇到点问题Debug到底层的一些源码,发现spring-data-redis的驱动包在某个版本之后替换为Lettuce。既然能被Spring生态所认可,Lettuce想必有过人之处,于是笔者花时间阅读她的官方文档,整理测试示例,写下这篇文章。
6517 0
|
2月前
|
人工智能
爆了爆了!Claude Fable 5 延期,codex 取消5小时使用限制,AI 外卖大战开打
Claude Fable 5 续期一周至 7/19,周额度暴涨 50%;OpenAI 回击取消所有计划使用限制。AI 大厂竞争白热化,用户赢麻了。
爆了爆了!Claude Fable 5 延期,codex 取消5小时使用限制,AI 外卖大战开打
|
2月前
|
人工智能 自然语言处理 安全
招投标垂直AI工具选型技术解析:垂直大模型+RAG架构的落地实践
本文剖析AI标书工具的技术分野:通用大模型存在领域理解浅、隐性风险漏判、内容幻觉等致命短板;而专业方案依托自研垂直大模型+RAG架构,深度融合招投标规则,实现高准确率结构化解析、100%事实可溯生成,并通过硬规则引擎与语义校验双轨风控、国密级私有化部署,保障央国企等高合规场景零废标、零泄密。
|
3月前
|
人工智能 缓存 自然语言处理
阿里云百炼Token Plan标准/高级/尊享坐席怎么选?Token Plan额度、计费与成本效益全面分析
阿里云百炼Token Plan是面向团队的AI大模型订阅服务,以Credits作为统一计量积分,覆盖文本生成、图像生成、代码开发等全场景模型调用,兼容主流AI编程与智能体工具,提供团队管理、预算管控、数据安全等企业级能力。该方案采用包月订阅制,提供标准、高级、尊享三档坐席,用户按月付费获取固定Credits额度,所有模型调用、工具使用、上下文缓存均按统一规则折算Credits扣除,告别传统按量付费的账单波动,实现AI使用成本的精准可控。本文将从资费额度、Token消耗规则、核心权益、性价比四个维度,全面对比三大坐席差异,为不同使用强度的团队提供清晰的选型参考。
481 0
|
11月前
|
人工智能 缓存 自然语言处理
Java与多模态AI:构建支持文本、图像和音频的智能应用
随着大模型从单一文本处理向多模态能力演进,现代AI应用需要同时处理文本、图像、音频等多种信息形式。本文深入探讨如何在Java生态中构建支持多模态AI能力的智能应用。我们将完整展示集成视觉模型、语音模型和语言模型的实践方案,涵盖从文件预处理、多模态推理到结果融合的全流程,为Java开发者打开通往下一代多模态AI应用的大门。
698 41
|
SQL 关系型数据库 MySQL
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
这是一份详细的MySQL安装与配置教程,适合初学者快速上手。内容涵盖从下载到安装的每一步操作,包括选择版本、设置路径、配置端口及密码等。同时提供基础操作指南,如数据库管理、数据表增删改查、用户权限设置等。还介绍了备份恢复、图形化工具使用和性能优化技巧,帮助用户全面掌握MySQL的使用方法。附带常见问题解决方法,保姆级教学让你无忧入门!
1520 21
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
|
Prometheus 监控 Cloud Native
Grafana 入门指南:快速上手监控仪表盘
【8月更文第29天】Grafana 是一款开源的数据可视化和监控工具,它允许用户轻松地创建美观的仪表盘和图表,以便更好地理解和监控数据。无论您是需要监控系统性能指标、应用程序日志还是业务关键指标,Grafana 都能提供灵活而强大的解决方案。本指南将带领您快速上手 Grafana,包括安装、配置以及创建第一个监控面板。
4438 2
|
Java Python
【python基础知识】python中怎么判断两个字符串是否相等
【python基础知识】python中怎么判断两个字符串是否相等
1489 0