概述
list数组元素计数器modcount 在iterator初始化的时候 赋值给expect 预计 count
在迭代器的next方法中会去检查是否修改
如果被修改了就回去跑出并发修改异常
modcount 在add方法的时候回去自增
简单来说list中的并发修改异常就是在多线程情况下,对list的迭代器进行遍历的时候操作原list对象,这个时候就会出现concurrentmodifiException
-----------------------------------------------------
今天看了狂神说的那个arraylist线程不安全的视频里面说的不太详细
加了sout 就会出现这个异常
原因在于
因为我们的list底层输数组,数组没有直接的tostring方法,只能通过便利将字符串拼接出来,拼接成
这样的一个字符串,每个线程都调用了tostring方法,就可能会出现线程安全问题
Arraylist会出现
1,并发修改异常
2,线程安全
并发修改异常刚刚我们说了,简单的说一下第二个线程安全问题
分析:结果应该是10000的,但是由于线程安全问题,在add这个方法调用的时候出现了索引位置的数据被覆盖的问题
因为咱们的list底层存储数据的结构是数组,总所周知arraylist是一个线程不安全的方法,在add和upadte delete的时候肯定都 不是同步的
就是这里,会出现索引位置的数据被重复赋值的问题,说人话就是被覆盖了,多个线程同时在执行 add方法的时候就会出现这个问题。
到这里衍生出另一个问题,怎么解决这些由于线程不安全出现的问题呢?
1:同步方法 -> vector
2: 集合工具类 collections 让其为我们创建一个线程安全的Arraylist ,非同步方法 而是使用lock锁
3:juc发病变编程 java.util.concurrent 包下的,CopyonwriteArraylisrt类 为我们创建一个线程安全的Arraylist
接下来主要讲juc并发变成下的 CopyonwriteArraylisrt
最后
以上就是有魅力向日葵为你收集整理的ArrayList迭代器并发修改异常,java基础,copyonwritelist的全部内容,希望文章能够帮你解决ArrayList迭代器并发修改异常,java基础,copyonwritelist所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复