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同步容器类迭代的线程安全:

    如果同步容器类的数据量很大,迭代的时候占用时间较长。迭代过程中可能会出现别的线程修改了容器的数据,这样迭代的时候可能会抛出异常(比如迭代到索引最后的元素,这时候另外一个线程删除了这个元素,这时候会抛出数组越界的异常)。

    但是如果迭代过程中加锁,那么就会出现性能问题。其中一种解决方案就是克隆容器,再迭代克隆的容器。(克隆期间需要加锁),但是克隆也是耗费CPU性能的。所以没有十全十美的办法。

posted @ 2017-03-19 19:46  拉夫德尔  阅读(1711)  评论(0编辑  收藏  举报