• ArrayList类源码浅析(三)


    1、看一个示例

    运行上述代码,抛出一个异常:

    这是一个典型的并发修改异常,如果把上述代码中的125行注释,把126行打开,运行就能通过了;

    原因:

      1)因为在迭代的时候,使用的是Itr类的对象,在调用hasNext()方法的时候,只要cursor和szie不相等就返回true;

      2)在Itr类中存在一个属性字段:expectedModCount,每次调用next()方法的时候都会检查expectedModCount和modCount是否相等,

        如果不相等,就会抛出异常;

      3)调用Itr类的remove()方法,运行能通过,因为在这个方法中,对expectedModCount字段做了重新赋值的操作;

    2、再看一个示例

    上述示例使用的是concurrent包中的CopyOnWriteArrayList类,运行情况跟(1)示例正好相反;

    打开145行,运行正常;如果注释145行,打开146行,则运行报错;分析一下原因:

      1)CopyOnWriteArrayList类中定义了一个重入锁,在调用remove()方法的时候加锁了,而且执行删除的逻辑与ArrayList逻辑不一样;

        创建一个新的数组,把数据赋值到新的数组中,然后重新设置数组;

      2)CopyOnWriteArrayList类也定义了一个内部类COWIterator,remove()方法内直接抛了一个异常

  • 相关阅读:
    Python:解析PDF文本及表格——pdfminer、tabula、pdfplumber 的用法及对比
    2018数学建模国赛B题
    目标检测综述整理
    numpy实现两层layer
    应用安全
    应用安全
    应用安全
    应用安全
    应用安全
    应用安全
  • 原文地址:https://www.cnblogs.com/lianliang/p/5757896.html
Copyright © 2020-2023  润新知