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

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,否则将会线程不安全。

示例代码:

 

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

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

上一篇:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。


下一篇:mahout推荐部分在hadoop上实现步骤分析