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性能的。所以没有十全十美的办法。