Java併發編程--併發容器之Collections

  在JDK1.2以前同步容器類包括Vector、Hashtable,這兩個容器經過內置鎖synchronized保證了同步。後面的ArrayList、LinkedList、HashMap、LinkedHashMap等等都不是線程安全的,沒有添加同步機制。可是JDK後面的Collections類也提供了這些常見容器類的同步容器類實現:將它們的狀態封裝起來,並對每一個公共方法都進行同步,使得每次只有一個線程能訪問容器狀態設計模式

  在Collections這個類下面提供了一些靜態類和靜態方法。好比常見的同步容器類的建立方法:數組

1 public static <T> List<T> synchronizedList(List<T> list);
2 
3 public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);
4 
5 public static <T> Set<T> synchronizedSet(Set<T> s);
6 
7 public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m);
8 
9 .....

  經過這些靜態方法將一個傳遞進去的集合包裝成同步的集合。這裏很明顯就用到了設計模式中的裝飾器模式。安全

  Collections同步容器類迭代的線程安全:
性能

    若是同步容器類的數據量很大,迭代的時候佔用時間較長。迭代過程當中可能會出現別的線程修改了容器的數據,這樣迭代的時候可能會拋出異常(好比迭代到索引最後的元素,這時候另一個線程刪除了這個元素,這時候會拋出數組越界的異常)。spa

    可是若是迭代過程當中加鎖,那麼就會出現性能問題。其中一種解決方案就是克隆容器,再迭代克隆的容器。(克隆期間須要加鎖),可是克隆也是耗費CPU性能的。因此沒有十全十美的辦法。線程

相關文章
相關標籤/搜索