zoukankan      html  css  js  c++  java
  • 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()方法内直接抛了一个异常

  • 相关阅读:
    [Swift]LeetCode900. RLE 迭代器 | RLE Iterator
    TNS-12508 When Issuing Any SET Command For The Listene
    shell getopts
    archive log full ora-00257
    php 验证码
    php 缩略图
    弧度
    php输出中文字符
    流程图
    windows clone 迁移数据库
  • 原文地址:https://www.cnblogs.com/lianliang/p/5757896.html
Copyright © 2011-2022 走看看