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

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

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

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

            有意思的是如果你的 Collection / Map 對象實際只有一個元素的時候, ConcurrentModificationException 異常并不會被拋出。這也就是為什么在 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方法,可以向迭代對象中添加數(shù)據(jù)

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 漳浦县| 咸阳市| 绥滨县| 琼结县| 平塘县| 高青县| 罗甸县| 西安市| 彰化市| 鄯善县| 新晃| 化隆| 富源县| 枞阳县| 井陉县| 庄浪县| 广州市| 鹿邑县| 南漳县| 和田县| 沂水县| 灵石县| 岳阳县| 塘沽区| 都昌县| 清远市| 梁河县| 本溪市| 许昌市| 蕉岭县| 饶阳县| 绥滨县| 苍南县| 青田县| 荥阳市| 滨海县| 长海县| 云龙县| 喜德县| 潮州市| 商城县|