對 Java 中的集合進行並發修改可能會導致一系列問題,例如意外行為、不確定的結果,甚至拋出 ConcurrentModificationException。要處理 Java 中集合的並發修改,可以使用以下方法之一:
- 使用同步集合:同步集合是一種線程安全的集合,可確保一次隻有一個線程可以修改該集合。我們可以通過調用Collections.synchronizedCollection()方法傳入要同步的集合來創建同步集合。
例如:
List<String> list = new ArrayList<>();
List<String> synchronizedList = Collections.synchronizedList(list);
- 使用並發集合:處理集合並發修改的另一種方法是使用並發集合。並發集合是線程安全的集合,允許多個線程同時修改集合,而無需外部同步。( java.util.concurrent ) 包提供了一系列並發集合類,例如ConcurrentHashMap、ConcurrentLinkedDeque和ConcurrentSkipListSet。
- 使用顯式鎖定:我們還可以使用顯式鎖定來處理對集合的並發修改。我們可以在修改集合時使用synchronized關鍵字或者(java.util.concurrent.locks)包來鎖定集合。
例如:
List<String> list = new ArrayList<>();
synchronized(list) {
list.add(“foo”);
}
- 正確使用迭代器:迭代集合時,應使用 Iterator 接口以避免並發修改。在使用迭代器迭代集合時發生修改,將收到 ConcurrentModificationException。應使用迭代器的remove() 方法刪除元素。
例如:
List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (someCondition) {
iterator.remove(); // safe way to remove an element from the list
}
}