第三次學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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章