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(); } }