第三次学JAVA再学不好就吃翔(part79)--并发修改异常产生的原因及解决方案

学习笔记,仅供参考,有错必纠




集合


并发修改异常产生的原因及解决方案


在这个博客中,我们用一个案例学习这个知识点。

  • 举个例子

现在,我有一个集合,我想判断这个集合中是否有"Gui"这个元素,如果有我就再添加一个"Yang"。

package com.guiyang.object;

import java.util.List;
import java.util.ListIterator;
import java.util.ArrayList;
import java.util.Iterator;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class Demo3_List {

	public static void main(String[] args) {
		List list = new ArrayList();
		
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		list.add("Gui");
		list.add("e");
		
		Iterator lit = list.iterator();
		
		while(lit.hasNext()) {
			String string = (String)lit.next();
			System.out.println(string);
			
			if ("Gui".equals(string)) {
				list.add("Yang");
				
			}
		}
		System.out.println(list);

	}

}

报错信息:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at com.guiyang.object.Demo3_List.main(Demo3_List.java:24)

我们看到,java抛出了一个ConcurrentModificationException异常(遍历的同时进行修改)


ConcurrentModificationException


ConcurrentModificationException异常,中文名为并发修改异常。当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。


解决方案


利用List集合特有的迭代方式ListIterator的特有功能add进行元素的添加。


  • ListIterator方法
ListIterator<E> listIterator()

返回此列表元素的列表迭代器(按适当顺序)


  • 举个例子
package com.guiyang.object;

import java.util.List;
import java.util.ListIterator;
import java.util.ArrayList;
import java.util.Iterator;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class Demo3_List {

	public static void main(String[] args) {
		List list = new ArrayList();
		
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		list.add("Gui");
		list.add("e");
		
		ListIterator lit = list.listIterator();
		
		while(lit.hasNext()) {
			String string = (String)lit.next();
			System.out.println(string);
			
			if ("Gui".equals(string)) {
				lit.add("Yang");
				
			}
		}
		
		System.out.println(list);
	}

}

输出:

a
b
c
d
Gui
e
[a, b, c, d, Gui, Yang, e]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章