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

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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值