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: }

转载于:https://www.cnblogs.com/tadckle/p/3530075.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值