码迷,mamicode.com
首页 > 其他好文 > 详细

ArrayList类源码浅析(三)

时间:2016-08-10 19:20:54      阅读:155      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!