當多個執行緒並發修改可變集合時會發生 ConcurrentModificationException,通常會違反其內部一致性。為了說明這個概念,讓我們分析遇到此異常的程式碼片段。
import java.util.*; public class ConcurrentModificationExample { 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 是在新增元素之前創建的,因此會引發異常。
為了避免此錯誤,我們可以修改程式碼如下:
import java.util.*; public class ConcurrentModificationExample { 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中文網其他相關文章!