日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迭代器生成器可迭代对象_使用迭代器时如何避免ConcurrentModificationException

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迭代器生成器可迭代对象_使用迭代器时如何避免ConcurrentModificationException 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

迭代器生成器可迭代對象

Java Collection類是快速失敗的,這意味著如果在使用迭代器遍歷某個線程的同時更改了Collection,則iterator.next()將拋出ConcurrentModificationException 。

在多線程以及單線程環境中都可能出現這種情況。

讓我們通過以下示例探索這種情況:

import java.util.*;public class IteratorExample {public static void main(String args[]){List<String> myList = new ArrayList<String>();myList.add("1");myList.add("2");myList.add("3");myList.add("4");myList.add("5");Iterator<String> it = myList.iterator();while(it.hasNext()){String value = it.next();System.out.println("List Value:"+value);if(value.equals("3")) myList.remove(value);}Map<String,String> myMap = new HashMap<String,String>();myMap.put("1", "1");myMap.put("2", "2");myMap.put("3", "3");Iterator<String> it1 = myMap.keySet().iterator();while(it1.hasNext()){String key = it1.next();System.out.println("Map Value:"+myMap.get(key));if(key.equals("2")){myMap.put("1","4");//myMap.put("4", "4");}}} }

輸出為:

List Value:1 List Value:2 List Value:3 Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)at java.util.AbstractList$Itr.next(AbstractList.java:343)at com.journaldev.java.IteratorExample.main(IteratorExample.java:27)

從輸出堆棧跟蹤中可以明顯看出,當我們調用迭代器next()函數時,異常即將到來。 如果您想知道Iterator如何檢查修改,則它的實現存在于AbstractList類中,其中定義了一個int變量modCount,該變量提供了更改列表大小的次數。 該值在每個next()調用中使用,以檢查功能checkForComodification()中是否有任何修改。

現在,注釋列表部分并再次運行該程序。

輸出將是:

Map Value:3 Map Value:2 Map Value:4

由于我們正在更新myMap中的現有鍵值,因此其大小沒有更改,并且沒有收到ConcurrentModificationException。 請注意,輸出結果可能在您的系統中有所不同,因為HashMap鍵集的排序不像list那樣。 如果您將在HashMap中添加新鍵值的語句取消注釋,則將導致ConcurrentModificationException。

要在多線程環境中避免ConcurrentModificationException:

1.您可以將列表轉換為數組,然后在數組上進行迭代。 這種方法適用于中小型列表,但是如果列表很大,則對性能的影響很大。

2.您可以通過將列表放在同步塊中來在鎖定時鎖定列表。 不建議使用此方法,因為它將停止多線程的好處。

3.如果使用的是JDK1.5或更高版本,則可以使用ConcurrentHashMap和CopyOnWriteArrayList類。 這是推薦的方法。

要在單線程環境中避免ConcurrentModificationException:

您可以使用迭代器remove()函數從基礎集合對象中刪除該對象。 但是在這種情況下,您可以從列表中刪除同一對象,而不能刪除任何其他對象。

讓我們使用并發集合類運行示例:

package com.journaldev.java;import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList;public class ThreadSafeIteratorExample {public static void main(String[] args) {List<String> myList = new CopyOnWriteArrayList<String>();myList.add("1");myList.add("2");myList.add("3");myList.add("4");myList.add("5");Iterator<String> it = myList.iterator();while(it.hasNext()){String value = it.next();System.out.println("List Value:"+value);if(value.equals("3")){myList.remove("4");myList.add("6");myList.add("7");}}System.out.println("List Size:"+myList.size());Map<String,String> myMap = new ConcurrentHashMap<String,String>();myMap.put("1", "1");myMap.put("2", "2");myMap.put("3", "3");Iterator<String> it1 = myMap.keySet().iterator();while(it1.hasNext()){String key = it1.next();System.out.println("Map Value:"+myMap.get(key));if(key.equals("1")){myMap.remove("3");myMap.put("4", "4");myMap.put("5", "5");}}System.out.println("Map Size:"+myMap.size());}}

輸出為:

List Value:1 List Value:2 List Value:3 List Value:4 List Value:5 List Size:6 Map Value:1 Map Value:null Map Value:4 Map Value:2 Map Size:4

從上面的示例可以清楚地看出:

1.可以修改Concurrent Collection類,避免ConcurrentModificationException 。

2.對于CopyOnWriteArrayList ,迭代器不適應列表中的更改,并且可以處理原始列表。

3.對于ConcurrentHashMap ,行為并不總是相同的。

條件:

if(key.equals("1")){myMap.remove("3");

輸出為:

Map Value:1 Map Value:null Map Value:4 Map Value:2 Map Size:4

它正在使用添加了鍵“ 4”的新對象。 但不是下一個鍵為“ 5”的對象。

現在,如果我將條件更改為

if(key.equals("3")){myMap.remove("2");

輸出為:

Map Value:1 Map Value:3 Map Value:null Map Size:4

在這種情況下,它不考慮新添加的對象。

因此,如果您使用的是ConcurrentHashMap,請避免添加新對象,因為可以根據鍵集對其進行處理。 請注意,同一程序可以在您的系統中打印不同的值,因為HashMap鍵集沒有任何順序。

額外的澆頭:

for(int i = 0; i<myList.size(); i++){System.out.println(myList.get(i));if(myList.get(i).equals("3")){myList.remove(i);i--;myList.add("6");} }

如果您在單線程環境中工作,并且希望您的代碼處理列表中額外添加的對象,則可以使用以下代碼并避免使用迭代器。

請注意,由于要刪除同一對象,所以要減少計數器,如果必須刪除下一個或更遠的對象,則不需要減少計數器。

自己嘗試。

參考:在JournalDev上 使用 JCG合作伙伴提供的迭代器時如何避免ConcurrentModificationException 。

    相關文章:

    • Java最佳實踐– Vector vs ArrayList vs HashSet
    • Java最佳實踐–隊列之戰和鏈接的ConcurrentHashMap
    • Java Fork / Join進行并行編程
    • ConcurrentLinkedHashMap v 1.0.1發布
    相關片段:
    • 阻塞隊列示例以執行命令
    • 信號量示例限制URL連接
    • 執行命令的同步隊列示例
    • 更一般的等待/通知機制的CountDownLatch示例

    翻譯自: https://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html

    迭代器生成器可迭代對象

    總結

    以上是生活随笔為你收集整理的迭代器生成器可迭代对象_使用迭代器时如何避免ConcurrentModificationException的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产欧美视频在线观看 | 朝桐光在线播放 | 日韩黄色av网站 | 天天操天天干天天爱 | 国产成人午夜高潮毛片 | 一级片免费看视频 | 中国一及毛片 | 亚洲理论电影在线观看 | 18男女无套免费视频 | 天天做天天躁天天躁 | 国产精品视频一区二区三区, | 欧美50p| 国产玖玖| 美女扒开屁股让男人桶 | 激情视频在线播放 | 亚洲成熟毛多妇女av毛片 | 在线观看www视频 | 亚洲av毛片一区二二区三三区 | 欧美性极品少妇xxxx | 国产无套粉嫩白浆内谢 | 成年免费在线观看 | 日韩精品四区 | 久久久久国产精品人妻 | 亚洲国产成人自拍 | 国产电影一区二区三区爱妃记 | 黄色在线免费 | 久久视频在线免费观看 | 国产刺激对白 | 日本人极品人妖高潮 | wwwxxx黄色片 | 午夜在线免费观看视频 | 国产网站免费观看 | 欧美少妇bbw | 精品动漫一区二区三区的观看方式 | 亚洲精品视频观看 | caoporn视频在线观看 | 免费毛片一级 | 99视频在线| 91最新国产 | 日本少妇bb | 黄色精彩视频 | 九九热只有精品 | 这里只有精品国产 | 国产人妻精品一区二区三区 | 午夜电影一区 | 日韩一区二区精品视频 | 欧美熟妇一区二区 | 欧美三级视频在线播放 | 日韩精品视频免费看 | 国产福利一区二区三区 | 污片免费看 | a级黄色录像 | 大香蕉毛片 | 午夜影院一区二区三区 | 国产图片一区 | 韩国三级在线视频 | 五月婷婷激情四射 | 欧美日性视频 | 欧美一区二区三区在线免费观看 | 亚洲欧美日韩中文字幕在线观看 | 超碰在线| 国产福利视频在线观看 | 免费看裸体网站视频 | 永久久久久久久 | 色妇av| 91老女人 | 亚洲欧美第一页 | 色秀av| 国产成人久久精品流白浆 | 色婷婷亚洲一区二区三区 | 亚洲av成人精品一区二区三区在线播放 | 精品一区二区三区免费视频 | 青春草在线视频免费观看 | 一本一道人人妻人人妻αv 九一在线视频 | 风流少妇一区二区三区91 | 亚洲va久久久噜噜噜无码久久 | 色综合91 | 男人添女人荫蒂国产 | 韩国伦理在线 | 午夜精品久久久久久久第一页按摩 | 国内露脸中年夫妇交换 | 国产高清无密码一区二区三区 | 91在线观看视频网站 | 久久精品国产亚洲av蜜臀色欲 | 久久久亚洲av波多野结衣 | 91久久国产视频 | www裸玉足久久久 | 韩漫动漫免费大全在线观看 | 成人在线观看国产 | 欧美一区二区视频免费观看 | 在线免费a视频 | 伦理av在线 | 午夜大片网 | 国产精品女优 | 向日葵视频在线 | 精产国产伦理一二三区 | 国产视频污在线观看 | 成人免费一区二区 | 精品人妻一区二区三区日产 |