专栏首页CoffeeLandjava 源代码里的failure mode
原创

java 源代码里的failure mode

Table of Content

  • fail-fast 机制
  • fail-safe 机制
  • refers

fail-fast

fail-fast: java对于使用iterator迭代器来遍历集合元素时, 对同时使用集合的add/remove修改集合元素, 这样由于集合用自身的方法修改时仅仅修改了自身的modCount,但是修改不了iterator的expectedModCount, 触发了fail-fast的条件,使得程序会停止这种修改行为并上报error的一种机制.

fail-fast的案例

private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            // Racy but within spec, since modifications are checked
            // within or after synchronization in next/previous
            return cursor != elementCount;
        }
        
        ......
        public void remove() {
            if (lastRet == -1)
                throw new IllegalStateException();
            synchronized (Vector.this) {
                checkForComodification();
                Vector.this.remove(lastRet);
                expectedModCount = modCount;
            }
            cursor = lastRet;
            lastRet = -1;
        }
        
        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
}

会抛出ConcurrentModificationException

fail-fast集合

CopyOnWriteArrayList, ConcurrentHashMap

fail-fast的解决方案

  • 使用基础for循环, 不要用foreach循环, foreach循环的底层是while和iterator
  • 使用fail-safe的集合

fail-safe

fail-safe的iterator在遍历时对集合的结构性更改(add,remove, update)不会throw CME异常, 因为这些fail-safe的集合是CopyOnWrite (COW), 也就是这些集合在做结构性更改的时候是对集合的clone进行操作, 等修改完再让oldRef = newRef

fail-safe 集合

CopyOnWriteArrayList, ConcurrentHashMap

Refers


此篇文章对你有帮助, 请不要吝啬你的赞, 因为这是对我创作的支持.

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java 并发编程基础

    总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和...

    CoffeeLand
  • java系统问题之cpu占用过高

    系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。

    CoffeeLand
  • 数据结构总结

    链式存储结构: 是把数据元素存放在任意的存储单元里, 这组存储单元可以是连续的,也可以不连续的

    CoffeeLand
  • 【干货】jquery_01第一例

    用户1730674
  • 猪年快乐之TensorFlow中实现word2vec及如何结构化TensorFlow模型

    猪年快乐之TensorFlow中实现word2vec及如何结构化TensorFlow模型

    公众号guangcity
  • StackNavigator in react-navigation 传参

    使用上面的方法即可进行参数传递 但是我建议当想下一个界面传参数时,使用唯一字段标识

    onety码生
  • tomcat学习|tomcat源码结构

    提到tomcat,相信大家都不陌生,只要是搞web开发的,老师总会让我们把应用打成war包,然后再丢到tomcat的webapp里面,然后就可以用ip:port...

    微笑的小小刀
  • Serverless SSR 技术在猎豹移动的实践

    为了追求速度体验和极致的 SEO 效果,越来越多的技术管理者和架构师倾向于采用 SSR (Server Side Rendering) 技术来构建前端项目,以支...

    腾讯云serverless团队
  • js 停止事件冒泡 阻止浏览器的默认行为

    在前端开发工作中,由于浏览器兼容性等问题,我们会经常用到“停止事件冒泡”和“阻止浏览器默认行为”。 浏览器默认行为: 在form中按回车键就会提交表单;单击鼠标...

    蓓蕾心晴
  • 致癌的日用品 美国公益宣传片

    分享达人秀

扫码关注云+社区

领取腾讯云代金券