黑马程序员--07.集合框架--并发访问异常理解:一个单线程程序的多线程运行思想【个人总结】

来源:互联网 发布:性感淘宝买家秀 编辑:程序博客网 时间:2024/05/15 15:39

集合中并发访问异常的理解:

      一个单线程程序的多线程理解

----------- 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学习型技术博客、期待与您交流! ------------