编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

月薪3万以上的程序员必备技能:fail-fast和fail-safe机制

wxchong 2024-08-09 11:37:12 开源技术 14 ℃ 0 评论

本文参考自阿里孤尽老师的《码出高效代码》一书的第六章,为了节省大家学习时间,在这里对重要知识进行了总结,如果有知识点不明白的可以关注作者,找作者要相关的具体学习资料(免费送上)。

一些大公司面试总会问一些Java集合相关的知识,如ArrayList实现原理、HashMap实现原理等。所以作者准备做一个针对Java集合进行剖析的专题(后续几篇文章会全部围绕Java集合展开)。

本篇文章从原理层面介绍Java集合两种错误检测机制,即fail-fast和fail-safe,并通过源码和案例说明使用中的注意事项。


fail-fast和fail-safe机制

Java集合常见的错误检测机制有fail-fast和fail-safe机制。

  • fail-fast: java.util下所有集合采用的错误检测机制。如:在集合遍历中出现意料外的修改时,通过unchecked异常暴力地反馈出来。实现原理:当前线程维护一个计数比较器(expectedModCount),记录已经修改的次数。在进入遍历前,会把实时修改次数modCount赋值给expectedModCount,如果这两个数据不相等,则抛出异常。
  • fail-safe: concurrent下所有集合采用的错误检测机制。 实现原理:在进入遍历前,记录当前集合的内容,然后遍历记录的集合内容,不关心集合在此期间的意外修改情况。


深度剖析fail-fast机制

由于多线程情况不方便理解和描述,同时ArrayList.subList()方法返回的集合在被操作时也会检测集合的意外修改情况,所以采用ArrayList.subList()来进一步阐述fail-fast机制。

如上述代码所示,通过ArrayList.subList()方法获取的子列表subList,在masterList集合个数增加或删除,均会导致子列表的遍历、增加、删除。原因见源码分析:

fail-fast下如何遍历删除:


深度剖析fail-safe机制

CopyOnWriteArrayList集合是fail-safe机制的典型体现,在多线程环境下可以使用CopyOnWriteArrayList代替ArrayList,该容器内部会对Iterator进行加锁操作。这个集合的Copy-On-Write(简称COW)是一种并发新思路,实行读写分离,如果是写操作,则复制一个新集合,在新集合写完毕后,在将原集合引用指向新集合。这样做的好处就是可以在不加锁的情况下对其进行读和遍历操作。

COW类型集合使用要注意:

  1. 尽可能设置合理的容量初始值,避免扩容(代价大)。
  2. 尽可能使用批量添加或删除方法,避免添加一个元素复制整个集合。

最后,fail-safe是在安全副本(或没有修改操作的正本)上进行遍历,集合修改与副本遍历没有任何关系,但是缺点就是读不到最新数据。这也是CAP理论中C(Consistency)与A(Availability)的矛盾,即一致性与可用性的矛盾。

END


笔者是一位热爱互联网、热爱互联网技术、热于分享的年轻人,如果您跟我一样,我愿意成为您的朋友,分享每一个有价值的知识给您。喜欢作者的同学,点赞+转发+关注哦!

点赞+转发+关注,私信作者“读书笔记”即可获得BAT大厂面试资料、高级架构师VIP视频课程等高质量技术资料。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表