黑马程序员--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学习型技术博客、期待与您交流! ------------
- 黑马程序员--07.集合框架--并发访问异常理解:一个单线程程序的多线程运行思想【个人总结】
- 黑马程序员 Collection 集合的个人总结
- 黑马程序员 Map集合的个人总结
- 黑马程序员--集合框架的总结
- 黑马程序员-集合框架总结
- 黑马程序员 集合框架 总结
- 分享一个基于winForm后台单线程推送多线程并行处理业务的小程序框架
- 黑马程序员--单线程与多线程
- 黑马程序员—单线程与多线程
- 黑马程序员_单线程和多线程
- 黑马程序员——java集合框架的理解
- 黑马程序员————多线程概述、同步死锁、线程控制、并发访问
- 黑马程序员--07.集合框架--02. 重写HashCode的内存变化过程以及两种重写hashCode方式的比较【个人总结】
- 黑马程序员--Java 多线程与并发总结
- 黑马程序员 java中的线程个人总结
- 黑马程序员--反射--实现一个简单的集合操作框架
- 黑马程序员:Java基础总结----集合框架的工具类
- 黑马程序员_java集合框架的一些总结
- android各种权限解释
- php持续集成工具:xinc中web界面配置分享
- main函数的前世今生
- windows server 2012 AD 活动目录部署系列(五)备份和还原域控制器
- Mysql 命令行中文乱码
- 黑马程序员--07.集合框架--并发访问异常理解:一个单线程程序的多线程运行思想【个人总结】
- 图(最小生成树的两中算法——普里姆算法和克鲁斯卡尔算法)
- OC中并发编程的相关API和面临的挑战(1)
- db2 “with ur”是什么意思!可以完成什么功能
- Spring定时任务写法
- 最长重复子串问题
- BFS+状态压缩 HDU1429
- Android 基础控件学习--Timer
- SQL Server监控清单