在Java中,集合框架提供了多种集合类,其中一部分是线程安全的,可以在多线程环境下使用。以下是常见的线程安全集合类:
1. 早期的线程安全集合类(位于java.util
包)
这些集合类通过使用synchronized
关键字实现线程安全,但性能较低,适合低并发场景。
- Vector:
- 线程安全的动态数组。
- 所有方法都被
synchronized
修饰。 - 性能较差,通常被
ArrayList
和Collections.synchronizedList
替代。
- Hashtable:
- 线程安全的哈希表。
- 所有方法都被
synchronized
修饰。 - 不允许
null
键或null
值。 - 性能较差,通常被
HashMap
和ConcurrentHashMap
替代。
- Stack:
- 继承自
Vector
,线程安全的栈结构。 - 所有方法都被
synchronized
修饰。
- 继承自
2. 使用Collections
工具类包装的线程安全集合
java.util.Collections
提供了一些静态方法,可以将非线程安全的集合包装为线程安全的集合。
- Collections.synchronizedList(List<T> list):
- 返回一个线程安全的
List
。 - 示例:
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
- 返回一个线程安全的
- Collections.synchronizedSet(Set<T> s):
- 返回一个线程安全的
Set
。 - 示例:
Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());
- 返回一个线程安全的
- Collections.synchronizedMap(Map<K, V> m):
- 返回一个线程安全的
Map
。 - 示例:
Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
- 返回一个线程安全的
- Collections.synchronizedCollection(Collection<T> c):
- 返回一个线程安全的
Collection
。
- 返回一个线程安全的
注意:这些方法返回的集合是通过同步块实现的,性能不如
java.util.concurrent
包中的并发集合。
3. java.util.concurrent
包中的并发集合
java.util.concurrent
包提供了高效的线程安全集合类,适合高并发场景。
- ConcurrentHashMap:
- 线程安全的哈希表,采用分段锁(JDK 7)或CAS + synchronized(JDK 8)实现。
- 支持高并发读写操作。
- 允许
null
值,但不允许null
键。
- CopyOnWriteArrayList:
- 线程安全的
List
,采用写时复制(Copy-On-Write)机制。 - 适合读多写少的场景。
- 允许
null
元素。
- 线程安全的
- CopyOnWriteArraySet:
- 基于
CopyOnWriteArrayList
实现的线程安全Set
。 - 适合读多写少的场景。
- 允许
null
元素。
- 基于
- ConcurrentSkipListMap:
- 线程安全的有序
Map
,基于跳表(Skip List)实现。 - 支持高并发操作。
- 线程安全的有序
- ConcurrentSkipListSet:
- 线程安全的有序
Set
,基于ConcurrentSkipListMap
实现。
- 线程安全的有序
- BlockingQueue及其实现类:
- 线程安全的阻塞队列,支持生产者-消费者模型。
- 常见实现类:
ArrayBlockingQueue
:基于数组的有界阻塞队列。LinkedBlockingQueue
:基于链表的可选有界阻塞队列。PriorityBlockingQueue
:支持优先级的无界阻塞队列。SynchronousQueue
:不存储元素的阻塞队列。
4. 其他线程安全集合
- ConcurrentLinkedQueue:
- 线程安全的无界非阻塞队列,基于链表实现。
- 适合高并发场景。
- ConcurrentLinkedDeque:
- 线程安全的无界非阻塞双端队列。
总结
- 早期线程安全集合:
Vector
、Hashtable
、Stack
(性能较差,不推荐使用)。 Collections
工具类包装的集合:synchronizedList
、synchronizedSet
、synchronizedMap
(适合低并发场景)。java.util.concurrent
包中的并发集合:ConcurrentHashMap
、CopyOnWriteArrayList
、BlockingQueue
等(适合高并发场景,推荐使用)。
THE END
暂无评论内容