是的,Iterator
仍可能拋出ConcurrentModificationException
,因爲它不與同步相關(儘管它的名字所暗示的,以便)。該Iterator
嘗試檢測在結構修飾(添加或對象的刪除)盡力而爲嘗試,而不管列表的操作是否同步。 一旦通過List.iterator() or List.listIterator()
獲得迭代器,對列表(除了迭代器本身)所做的任何更改都將盡最大努力拋出CME異常。 可以確保ConcurrentModificationException
唯一的辦法就是不甩 或者是通過讓您的閱讀器操作完成,然後再作家操作(反之亦然),或通過使用一個故障安全的Iterator從ConcurrentHashMap
Map hashmap = new HashMap<String,ArrayList<String>();
----
Map<String,ArrayList<String>> m = new ConcurrentHashMap<String,ArrayList<String>(hashmap));
的ConcurrentHashMap是一個故障安全迭代器,現在您可以專注於同步讀寫器操作,而不用擔心ConcurrentModificationException。
如何修改地圖?你沒有提到它。 – Bohemian
那麼,我即將設計一個系統。我正在考慮使用ReadWriteLock。這就是爲什麼我想探索所有可能的場景。 – Touchstone
您的問題中的代碼是100%線程安全的,因爲無法修改地圖 - 沒有直接引用地圖。 – Bohemian