集合中并发访问异常的理解:
一个单线程程序的多线程理解
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. 问题描述
问题产生背景
/*需求:对List集合中的元素进行取出,,取出的时候,做一些额外的操作
*迭代的过程中,准备同时添加元素或者删除元素
* */
(1). 代码
//出问题的方法
public void methodConcurrentModificarionException(){
Iteratorit = al.iterator();
sop(al);
while(it.hasNext()){
Objectobj =it.next();
if(obj.equals("java002")){
al.add("java008");
}
}
sop(al);
}
运行时,抛出异常:
为什么单线程的程序,出现了并发异常呢?并发不是发生在多线程的程序里面么?
(2). 这个异常可以使用多线程的思想去理解
【个人观点】上面的单线程程序可以看成下面的多线程程序
al存放了元素对象的引用,it也同样存放了对象元素的引用 (通过Iterator it = al.iterator();)。所以,既可以通过al来操作集合,也可以通过it来存取元素。
但是al和it操作的是一组共享数据,按照多线程的思想(尽管这里不是多线程),把操作al的看成是一个独立的线程在操作,操作it看成是另一个线程在操作。当执行到 “if(obj.equals("java002")){//“操作it的线程已经访问了共享数据”之后,操作it的线程通过Thread.sleep(xxx)睡眠,交出了CPU的执行权,此时操作al的线程马上获取到CPU的执行权,马上就运行al.add("java008");语句。这样集合中的共享数据在没有锁机制的保障之下,被两个线程并发访问了。集合框架事先不允许这样的事情发生,所以,抛出了并发异常。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------