A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© VMiracleV 中级黑马   /  2018-3-31 22:02  /  756 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 VMiracleV 于 2018-4-27 09:45 编辑

    前两天看我们大表姐发了一个链接,我以为是什么好东西,就点进去看了,结果一看就无法自拔。
    这个东西,一开始看的时候有点懵,看得自己都感觉自己萌萌哒了。后来静下心来想了想,再怎么也不能靠个萌字吃饭呀,所以我中午的时候点了个外卖,吃饱之后继续去理解这东西。
    一方面,没有理解得那么深,现在自己能表达出来的和并发修改异常相关的东西确实有限。另一方面,自己也不想像写那些论文一样,说得面面俱到,最后把看的人给搅昏了。抽重点,抽重点。
    1.产生并发修改异常的情况:使用迭代器Iterator遍历集合的同时修改集合的大小size,就会报此异常。
    2.抛出异常的原因:AbstractList中的checkForComodification方法的调用引起的,在使用Iterator的时候,就会调用到这个方法
    3.(这一条我的废话会说得比较多,但是感觉少了哪条废话,都会表达不出我的意思,除了括号里面这条)
(1)创建集合对象时会同时生成一个成员变量modCount,代表集合大小的改变次数;(2)使用Iterator时也会生成它自己的成员变量expectedModCount,并把modCount的值赋给他,同时调用checkForComodification方法;(3)这个方法就和我们以前的门卫大爷一样死脑筋,没带学生牌就不让进,如果modCount和expectedModCount不相同,它就报错(给钱都不行的那种);(4)如果Iterator还在运行,expectedModCount就一直保持着最开始的modCount的值,在这个过程中,对集合的大小进行了改变,modCount就会自加,从而导致两个值不相等,恪尽职守的门卫大爷checkForComodification就要报错,给钱都不行。
    4.解决方法:(1)不走这个门进去,绕过门卫大爷,也就是不用Iterator,用普通的for循环遍历就行了。(2)欺负门卫大爷傻,自己画一个学生牌。只要modCount发生了改变,我就把expectedModCount跟着一起变一下,这样两个东西不就一直相等了。
    这些对代码的分析和解决办法不是我自己原创的,是看了小蜀哥哥的帖子,然后写出自己的理解,所以不要说我抄袭呀,人生已是如此艰难,有些事就不要拆穿

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马