1. 程式人生 > >同步類容器併發修改的問題

同步類容器併發修改的問題

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();
    }