1. 程式人生 > >併發修改異常原理與解決方法

併發修改異常原理與解決方法

什麼是併發修改異常:

當我們在遍歷實現了collection介面與iterator介面的集合時(List、Set、Map), 我們可以通過遍歷索引也可以通過迭代器進行遍歷。在我們使用迭代器進行遍歷集合的時候,會獲取到當前集合的迭代物件。在裡面有封裝了迭代器的remove方法與集合自帶的remove方法,如果我們呼叫迭代器物件的remove方法是沒問題的,但是當我們呼叫集合自帶的remove方法時,就會產生ConcurrentModificationException 併發修改異常。也就是說,當我們通過迭代器進行遍歷集合的時候,是不允許集合本身在結構上發生變化的。

示例程式碼如下:

package iteratorDemo;

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

public class ArrayListDemo {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < 10; i++) {
			list.add(String.valueOf(i));
		}
		System.out.println("遍歷之前集合的長度為:");
		System.out.println(list.size());
		//獲取集合的迭代器物件
		Iterator<String> iterator = list.iterator();
		//打印出迭代器的地址
		System.out.println(iterator.toString());
		//用iterator迭代器進行遍歷
		while(iterator.hasNext()) {
			String next = iterator.next();
			System.out.println(next);
			/**
			 * 在使用迭代器的同時進行集合結構的變化
			 */
			//list.remove(0);
			if(Integer.parseInt(next)%2==0) {
				//呼叫迭代器本身的remove方法
				iterator.remove();
			}
		}
		System.out.println("遍歷之後集合的長度為:");
		System.out.println(list.size());
		
		for (String string : list) {
			System.out.println("開始進行增強for迴圈下的刪除操作");
			list.remove(0);
		}
	} 
}

執行之後的結果為:

遍歷之前集合的長度為:
10
[email protected]
0
1
2
3
4
5
6
7
8
9
遍歷之後集合的長度為:
5
開始進行增強for迴圈下的刪除操作
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at iteratorDemo.ArrayListDemo.main

(ArrayListDemo.java:35)

在上面通過增強for迴圈實現將集合進行遍歷,也產生了併發修改異常,因為在底層也是呼叫的迭代器。

如果在以後在迭代器遍歷時,需要對集合進行增刪操作時,要呼叫迭代器本身的remove方法。

相關推薦

併發修改異常原理解決方法

什麼是併發修改異常: 當我們在遍歷實現了collection介面與iterator介面的集合時(List、Set、Map), 我們可以通過遍歷索引也可以通過迭代器進行遍歷。在我們使用迭代器進行遍歷集合的時候,會獲取到當前集合的迭代物件。在裡面有封裝了迭代器的remove方法

淺談xss攻擊原理解決方法

ntb name 出現 AD 提交 參數傳遞 anti val 什麽 概述 XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁註入可執行代碼且成功地被瀏覽器 執行,達到攻擊的目的,形成了一次有效XSS攻擊,一旦攻擊成功,它可以獲取用戶的聯系人列表,然後向聯系人發送

weblogic修改jdk版本遇到的問題解決方法

set res 聯網 內存 war pro dom href div 1.修改setDomainEnv ,路徑.../domains/xx_domain\bin\ 1.1修改JAVA_HOME為需要修改的路徑 註意:BEA_JAVA_HOME路徑不需修改 2.

java:集合框架(併發修改異常產生的原因及解決方案)

A:案例演示     * 需求:我有一個集合,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。 public class Demo3_List

迭代器迭代元素,迭代器修改元素;集合集合遍歷元素集合修改元素解決併發修改異常

import java.util.ArrayList;import java.util.List;import java.util.ListIterator;public class TextDemo1

Servlet執行原理及404、500、405異常原因和解決方法總結

一、Servlet執行原理 比如,在瀏覽器位址列輸入          http://ip:port/web01/hello 整個通訊流程如下圖所示: 分步解釋:          1、瀏覽器依

什麼是分散式檔案系統?分散式檔案系統的原理、出現的問題解決方法

本地檔案系統如ext3,reiserfs等(這裡不討論基於記憶體的檔案系統),它們管理本地的磁碟儲存資源、提供檔案到儲存位置的對映,並抽象出一套檔案訪問介面供使用者使用。但隨著網際網路企業的高速發展,這些企業對資料儲存的要求越來越高,而且模式各異,如淘寶主站的大量商品圖片,其

關於未將物件引用設定到物件例項簡單原理分析,解決方法

這個問題我相信困擾著許多的,剛剛入門面向物件思想的同學。 其實這個問題沒有想象中的那麼複雜,只是太多同學把寫程式碼想得太過於快餐。不知道現在還有多少同學在處錯誤的時候,先讀完錯誤提示再去看怎麼錯的呢? 下面我來給大家分析一下這個“未將物件引用設定到物件例項”這個問題。 在我

C#中異常:“The type initializer to throw an exception(型別初始值設定項引發異常)”的簡單分析解決方法

對於C#中異常:“The type initializer to throw an exception(型別初始值設定項引發異常)”的簡單分析,目前本人分析兩種情況,如下: 情況一: 其實麒麟.NET的這篇文章主要講解分析了靜態成員的方面,總的說就是:型別初始化或訪問

黑馬程式設計師-java基礎-併發修改異常產生的原因和解決方案

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ------- * 問題?  * 我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。  *   * Conc

zabbix   監控平臺搭建過程中的報錯解決方法總結

監控 zabbix 運維自動化1.php option post_max_size 2.php option max_execution_time 3.php option max_input_time 4.php time zone 5.php bcm

python常見異常分類處理方法

異常 error python except try Python常見異常類型大概分為以下類: 1.AssertionError:當assert斷言條件為假的時候拋出的異常 2.AttributeError:當訪問的對象屬性不存在的時候拋出的異常 3.IndexError

inline-block元素的空隙解決方法

rom move 寬高 上下文 無效 cin idt 遮擋 inpu 多次遇到了使用inline-block後留下間隙的問題,所以記錄一下,以提醒自己以後留意這點。 現象描述: 使用display:inlie-block後和一些行內元素都有此現象如:<a&g

jar包中File 文件找不到的異常分析解決

http ont blog except .... 我們 too 格式 結果 源鏈接: http://hxraid.iteye.com/blog/483115#comments 我們常常在代碼中讀取一些資源文件(比如圖片,音樂,文本等等)。在單獨運行的時候這些簡單的處理

AppFuse 3常見問題解決方法

新建 配置 ng- fuse contex ext 什麽 article ger 非常長一段時間沒做SSH項目了。近期抽出時間看了一下升級到3.x的appfuse,對新版本號使用過程中出現的一些問題進行了排查。匯總例如以下。以備後用。本文原文出處: http://blog

spring定時任務執行兩次的原因解決方法

ref net 任務 article 服務 每次 bsp tail 本地 spring定時任務,本地執行一次,放到服務器上後,每次執行時會執行兩次,原因及解決辦法。 http://blog.csdn.net/yaobengen/article/details/70312

CSS - 移動端 常見小bug整理解決方法總結【更新中】

mic ros class clas 問題 像素 css strong 常見問題 常見問題總結與整理系列~ 1. border一像素在手機上看著有點粗的問題: 原理是因為:1px在手機上是使用2dp進行渲染的 換成 border: 0.5像素?是不行的!

希捷企業盤ST4000NM0035 V5更新TN04固件遇到的問題解決方法

失敗 mailto ges 51cto ext tex ado term 遇到的問題 問題說明:近期組NAS入了一塊希捷企業版硬盤V5,但高頻噪音過大,在論壇翻帖子了解到更新固件可解決此問題,又有@天涯望月發布的更新固件教程,故下決心更新固件。官網的企業盤V5固件已經更新到

MySQL的Illegal mix of collationsy異常原因和解決方法

ear 代碼 clear 今天 tag 類型 資料 bsp net 原創 2008年12月25日 11:54:00 標簽: mysql / collation / character / variables / database / server 今天

java.sql.SQLException: Field 'id' doesn't have a default value(用eclipse操作數據庫時報了這種奇怪的錯誤)的原因解決方法

sql microsoft java except body class 操作數 解決方法 family 1、錯誤原因 由於id在數據庫表中是作為主鍵,但是在插入的過程中,沒有給予數值,並且沒有讓其自增 2、解決辦法 修改數據庫表中的id,讓