首页 > 其他 > 详细

ArrayList类源码浅析(三)

时间:2016-08-10 19:19:54      阅读:140      评论:0      收藏:0      [点我收藏+]

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()方法内直接抛了一个异常

技术分享

技术分享

 

ArrayList类源码浅析(三)

原文:http://www.cnblogs.com/lianliang/p/5757896.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!