LinkedList - java.util.ConcurrentModificationException
package com.test.io;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import com.mysql.jdbc.Buffer;
public class ReadKeyFile {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader=null;
try {
bufferedReader = new BufferedReader(new FileReader("C:/Users/Administrator/Desktop/test.txt"));
LinkedList<String> list = new LinkedList<String>();
String str=bufferedReader.readLine();
while((str=bufferedReader.readLine())!=null) {
System.out.println(str);
list.add(str);
}
System.out.println("------------");
for (String string : list) {
System.out.println(list.removeLast());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(bufferedReader != null)
bufferedReader.close();
}
}
}
结果及报错:
22222222222222222222
33333333333333333333
44444444444444444444
55555555555555555555
66666666666666666666
77777777777777777777
------------
77777777777777777777
java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966)
at java.util.LinkedList$ListItr.next(LinkedList.java:888)
at com.test.io.ReadKeyFile.main(ReadKeyFile.java:24)
test.txt:
11111111111111111111 22222222222222222222 33333333333333333333 44444444444444444444 55555555555555555555 66666666666666666666 77777777777777777777
如果将源代码红色部分替换为以下,则可以正常输出,可见问题并不在remveLast()方法,而在迭代。
System.out.println(list.removeLast()); System.out.println(list.removeLast());
在网上查到一段文字:
1.在使用增强for循环进行集合的迭代的时候其实默认使用的是迭代器;2.因此在循环中不能使用集合的引用变量直接操作集合,避免导致多线程并发访问的安全性异常。
1的意思即增强for循环的遍历方式类似与:
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
System.out.println(iterator.next());
鉴于此,有必要看一下LinkedList的代码。在LinkedList中,这个iterator就是ListItr ,它是继承自Itr类,next()方法正是出自Itr类,在里面找到next()的源码如下:
public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
注意checkForComodification(),这就是报错的地方啦,具体是在下面这个地方报的错:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
根据我们的测试:LinkedList打印出第一排7就报错了。
modCount 这个在打应出第一排7之后的值应该为8,因为add了7次,又removeLast了一次嘛
那expectedModCount为多少呢?
看看Itr源代码吧,真乱,又实在是不想去读注释,我还是去翻翻JAVA编程思想先。
好吧,翻了一下书没翻到,百度了一下,又重新看了下代码,继续上面的问题,expectedModCount的值。
expectedModCount的值在removeLast之后为7。因为add里面有expectedModCount=modCount这样的语句,而removeLast里面没有。
这样的机制,应该是为了检测一边迭代,一边修改集合的危险操作。
LinkedList - java.util.ConcurrentModificationException的更多相关文章
- Iterator之java.util.ConcurrentModificationException
在运行以下代码时,会报java.util.ConcurrentModificationException异常, public class Demo { public static void main( ...
- 增强for循环 java.util.ConcurrentModificationException
Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元 ...
- java.util.ConcurrentModificationException 解决办法(转载)
今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可,测试代码: public cla ...
- java.util.ConcurrentModificationException --map
key:3-key key:/v1.02-key Exception in thread "main" java.util.ConcurrentModificationExcept ...
- 偶遇到 java.util.ConcurrentModificationException 的异常
今天在调试程序 遇到了如此问题 贴上代码来看看稍后分析 List<String> list = null;boolean isUpdate = false;try { list = JSO ...
- 对ArrayList操作时报错java.util.ConcurrentModificationException null
用iterator遍历集合时要注意的地方:不可以对iterator相关的地方做添加或删除操作.否则会报java.util.ConcurrentModificationException 例如如下代码: ...
- java.util.ConcurrentModificationException 解决办法
在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 则使用会报以下异常:Java.util.ConcurrentModific ...
- java.util.ConcurrentModificationException 解决办法(转)
今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可,测试代码: public cla ...
- java集合--java.util.ConcurrentModificationException异常
ConcurrentModificationException 异常:并发修改异常,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.一个线程对collection集合迭代,另一个线程对Co ...
随机推荐
- jQuery FileUpload等插件的使用实例
1.jQuery FileUpload 需要的js: jquery.js jquery.fileupload.js jquery.iframe-transport.js jquery.xdr-tran ...
- MDI窗体
1.设置父窗体 使用MDI窗体,需要先将父窗体的IsMdiContainer属性设置为True 2.生成用于MDI子窗体的窗体 1 frmTemp f1 = new frmTemp(); f1.Tex ...
- float 在内存中如何存储的
float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准: 一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...
- 学习Selenium2Library的好例子
最近好几个人问我有没有好的例子可以帮助学习Selenium2Library怎么用.对于公司同事,可以把脚本直接给过去,其他人则不行了.所以一直想做一个好的学习样例,这个样例应该有如下特性: 能够非常好 ...
- android studio插件提升工作效率
SonarLint 代码质量管理插件 ButterKnife Zelezny ButterKnife 生成器,快速根据布局文件生成属性对象. SelectorChapek 设计师给我们提供好了各种资源 ...
- rabbitMQ中vhost虚拟主机的理解
每个virtual host本质上都是一个RabbitMQ Server,拥有它自己的queue,exchagne,和bings rule等等.这保证了你可以在多个不同的application中使用R ...
- oracle 学习
一.数据库语言部分1. SQL语言:关系数据库的标准语言2. PL/SQL:过程化语言Procedural Language3. SQL*Plus:简单的报表,操作系统接口 4. Oracle 8.0 ...
- Java for LeetCode 219 Contains Duplicate II
Given an array of integers and an integer k, find out whether there there are two distinct indices i ...
- PUTTY的使用教程
Putty是一个优秀的,开源的SSH远程登录软件. 它不仅仅可以实现登录,还有很多高级功能. PuTTY is a free SSH, Telnet and Rlogin client for 32- ...
- IOS 推送消息 php做推送服务端
IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPh ...