Java中哪些集合是线程安全的
- java.util.Collection是一个集合接口,Collection接口在java中的具体实现有很多,
其中ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。Vector、HashTable是线程安全的。
- Collections是集合类的一个工具类,它提供了一系列静态方法,用于对集合中元素进行排序,搜索以及线程安全等各种操作
其中将集合包装成安全集合的静态方法有:
- &t;T> Collection<T> synchronizedCollection(Collection<T> c): 返回指定colection 对应的线程安全的colection。
- static &t;T> List<T> synchronizedList(List<T> list): 返回指定List对象对应的线程安全的List 对象。
- static &t;K, V> Map<K, V> synchronizedMap(Map<K, V> m): 返回指定Map对象对应的线程安全的Map对象。
- static &t;T> Set<T> synchronizedSet(Set<T> s): 返回指定Set对象对应的线程安全的Set对象。
- static &t;K, V> SortedMap<K, V> synchronizedSortedMap(SortedMap<K, V> m): 返回指定SortedMap对象对应的线程安全的SortedMap对象。
- static &t;T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s): 返回指定SortedSet对象对应的线程安全的SortedSet对象。
- 上诉提到的线程安全都属于同步类容器,其底层的机制无非是用synchronized关键字对每个公用的方法都进行同步,他们虽然实现了线程安全,但是降低了并发性,在多线程环境时,严重降低了应用程序的吞吐量。jdk5.0以后提供了多种并发容器来替代同步类容器从而改善性能,如:
- ConcurrentHashMap,ConcurrentSkipListMap,ConcurrentSkipListSet,ConcurrentLinkedQueue和ConcurrentLinkedDeque等
- 以CopyOnWrite开头的集合类,如CopyOnWriteArrayList,CopyOnWriteArraySet等