同步類容器併發修改的問題
阿新 • • 發佈:2018-10-31
1、同步類容器都是執行緒安全的,在某些場景下需要加鎖來保護複合操作。
2、常見的複合操作有:迭代(反覆訪問元素,遍歷容器中所有元素)、跳轉(根據指定的順序找到當前元素的下一個元素)、以及條件運算等。
3、在這些複合操作下,進行併發的修改(add或remove)容器時,會丟擲java.util.ConcurrentModificationException異常。在早期的迭代器設計的時候並沒有考慮併發修改的問題。
...
Vector v = new Vector<>();
v.add("1");
v.add("2");
v.add("3");
...
public Collection<String> m2(Vector<String> list) { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String temp = iterator.next(); if ("3".equals(temp)) { list.remove(temp); } } return list; }
4、閱讀原始碼可以看到,在AbstractList類裡面定義有成員變數modCount(修改次數)和expectedModCount(期望修改次數,初始值為modCount),在多執行緒併發下修改時候會出現這兩個值不相等,而丟擲ConcurrentModificationException異常。
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}