首頁 >Java >java教程 >在 Java 中迭代集合時如何避免 ConcurrentModificationException?

在 Java 中迭代集合時如何避免 ConcurrentModificationException?

Linda Hamilton
Linda Hamilton原創
2024-11-27 15:31:10658瀏覽

How Can I Avoid ConcurrentModificationException When Iterating Over Collections in Java?

Java 中的並發修改異常

在 Java 中使用多執行緒應用程式或迭代集合時,必須避免並發修改。並發修改是指在迭代器主動迭代同一個集合時對集合進行更改。

請考慮以下程式碼片段來說明問題:

import java.util.*;

public class SomeClass {
    public static void main(String[] args) {
        List<String> s = new ArrayList<>();
        ListIterator<String> it = s.listIterator();

        for (String a : args)
            s.add(a);

        if (it.hasNext())
            String item = it.next();

        System.out.println(s);
    }
}

此程式碼嘗試迭代使用 ListIterator 遍歷清單。但是,如果在使用迭代器 (it) 遍歷清單時向清單中新增元素 (s.add(a)),則可能會發生並發修改異常。

要解決此問題, Java 提供了快速失敗迭代器。每當迭代器嘗試存取集合時,它都會檢查集合的變更是否超出了迭代器的初始存取範圍。如果以任何超出迭代器存取點的方式修改集合,將會拋出 ConcurrentModificationException 例外。

避免並發修改異常的更新程式碼片段如下:

import java.util.*;

public class SomeClass {
    public static void main(String[] args) {
        List<String> s = new ArrayList<>();

        for(String a : args)
            s.add(a);

        ListIterator<String> it = s.listIterator();    
        if(it.hasNext()) {  
            String item = it.next();   
        }  

        System.out.println(s);
    }
}

請務必記住,ListIterator 無法識別創建迭代器之前發生的修改,只能識別使用迭代器時發生的修改。此外,迭代器不會阻止並發修改的發生,而是檢測並發修改並在發生時拋出異常。為了完全防止並發修改,應該採用同步機制。

以上是在 Java 中迭代集合時如何避免 ConcurrentModificationException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn