Java集合和Apache-Commons-Collections的线程安全机制

By | 2015年4月19日

JDK中线程安全的类包括:

  • Vector:与ArrayList最大的差别就是线程安全
  • Stack:线程安全,不常使用;推荐使用Deque接口的ArrayDeque实现类
  • Hashtable:相对HashMap而言,线程安全

      我所知道的上面三个类线程安全,其它的大部分都是线程不安全的。比较意外的是,常用的List、Map、Set等都是线程不安全的,不常用的反而线程安全。

PS: enum 类实现了 Enumeration接口,有人说它是线程安全的,其实不是。

 

如何保证线程安全?

Apache Commons-Collections中大部分集合类的实现都是线程不安全的,我们在使用这些集合的时候,为需要同步的方法体加上synchronized关键字,可以保证线程安全。

Commons-Collections使用了Java的集合synchronization机制,我们可以使用jdk中Collections工具类将线程不安全的集合包装成线程安全的集合。Collections中的synchronizedXXX(Collection<T> c)方法,返回一个以原集合为基础的线程安全的集合。

      当对返回的集合进行遍历时,需要手动加上synchronized,否则将会线程不安全。

示例代码:

    Set<String> set = Collections.synchronizedSet(new HashSet<String>());
    synchronized(set) {
        Iterator<String> i = set.iterator(); //一定要放在synchronized代码块中
         while(i.hasNext()) {
            i.next();
        }
    }