零全零美(www.zzgwt.com)
          生活中的很多事情,并不像If...Else那么簡單!
          posts - 96,comments - 52,trackbacks - 0

          當(dāng)使用 fail-fast iterator 對(duì) Collection 或 Map 進(jìn)行迭代操作過程中嘗試直接修改 Collection / Map 的內(nèi)容時(shí),即使是在單線程下運(yùn)行, java.util.ConcurrentModificationException 異常也將被拋出。

            Iterator 是工作在一個(gè)獨(dú)立的線程中,并且擁有一個(gè) mutex 鎖。 Iterator 被創(chuàng)建之后會(huì)建立一個(gè)指向原來對(duì)象的單鏈索引表,當(dāng)原來的對(duì)象數(shù)量發(fā)生變化時(shí),這個(gè)索引表的內(nèi)容不會(huì)同步改變,所以當(dāng)索引指針往后移動(dòng)的時(shí)候就找不到要迭代的對(duì)象,所以按照 fail-fast 原則 Iterator 會(huì)馬上拋出 java.util.ConcurrentModificationException 異常。

            所以 Iterator 在工作的時(shí)候是不允許被迭代的對(duì)象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對(duì)象, Iterator.remove() 方法會(huì)在刪除當(dāng)前迭代對(duì)象的同時(shí)維護(hù)索引的一致性。

            有意思的是如果你的 Collection / Map 對(duì)象實(shí)際只有一個(gè)元素的時(shí)候, ConcurrentModificationException 異常并不會(huì)被拋出。這也就是為什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.

          使用LinkedIterator解決,LinkedIterator有add方法,可以向迭代對(duì)象中添加數(shù)據(jù)

          在使用Foreach迭代時(shí),如果使用如果刪除元素,也會(huì)發(fā)生異常,

          posted on 2008-04-18 00:33 零全零美 閱讀(196) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 博野县| 会泽县| 日喀则市| 盈江县| 济源市| 凭祥市| 潜江市| 蓬安县| 山丹县| 怀集县| 沾益县| 天气| 都昌县| 漯河市| 邹平县| 南岸区| 平定县| 松原市| 灌南县| 全椒县| 青州市| 乐陵市| 含山县| 安徽省| 上饶市| 宁阳县| 新绛县| 澜沧| 新化县| 钦州市| 金乡县| 邯郸县| 阳春市| 隆林| 遂平县| 昭平县| 额敏县| 鄂伦春自治旗| 将乐县| 凤山县| 黔江区|