面试题:Java 线程安全的集合有哪些?

在 Java 中,线程安全的集合是指多个线程可以同时访问和修改而不会导致数据不一致的集合。Java 提供了多种线程安全的集合类,主要分为以下几类:


1. java.util.Collections 工具类提供的同步集合

Collections 工具类提供了一些静态方法,可以将普通的集合转换为线程安全的集合。这些方法返回的集合是通过同步包装实现的。

(1)同步列表(Collections.synchronizedList
  • 特点:通过同步方法保证线程安全。
(2)同步集合(Collections.synchronizedSet
  • 特点:通过同步方法保证线程安全。
(3)同步映射(Collections.synchronizedMap
  • 特点:通过同步方法保证线程安全。
注意事项
  • 使用这些同步集合时,需要手动对迭代器进行同步,否则可能会导致并发修改异常。
  • 性能较低,因为所有方法都是同步的。

2. java.util.concurrent 包中的并发集合

java.util.concurrent 包提供了一系列高性能的线程安全集合类,这些集合类通过更细粒度的锁或无锁算法实现线程安全。

(1)CopyOnWriteArrayList
  • 特点
    • 写操作时复制底层数组,读操作无锁。
    • 适用于读多写少的场景。
(2)CopyOnWriteArraySet
  • 特点
    • 基于 CopyOnWriteArrayList 实现,适用于读多写少的场景。
(3)ConcurrentHashMap
  • 特点
    • 使用分段锁或无锁算法实现高并发。
    • 支持高并发的读写操作。
(4)ConcurrentSkipListMap
  • 特点
    • 基于跳表实现的有序映射。
    • 支持高并发的读写操作。
(5)ConcurrentSkipListSet
  • 特点
    • 基于 ConcurrentSkipListMap 实现的有序集合。
    • 支持高并发的读写操作。
(6)BlockingQueue 及其实现类
  • 特点
    • 支持阻塞操作的队列。
    • 适用于生产者-消费者模型。
  • 常见实现类
    • ArrayBlockingQueue:基于数组的有界阻塞队列。
    • LinkedBlockingQueue:基于链表的可选有界阻塞队列。
    • PriorityBlockingQueue:支持优先级的无界阻塞队列。
    • SynchronousQueue:不存储元素的阻塞队列。
    • DelayQueue:基于优先级的延迟队列。

示例

BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(10);

3. java.util.Vector 和 java.util.Hashtable

  • 特点
    • 早期提供的线程安全集合类。
    • 所有方法都是同步的,性能较低。

4. 总结

集合类型特点适用场景
Collections.synchronizedList同步方法实现线程安全简单的同步需求
Collections.synchronizedSet同步方法实现线程安全简单的同步需求
Collections.synchronizedMap同步方法实现线程安全简单的同步需求
CopyOnWriteArrayList写时复制,读操作无锁读多写少的场景
CopyOnWriteArraySet写时复制,读操作无锁读多写少的场景
ConcurrentHashMap分段锁或无锁算法,高并发高并发读写场景
ConcurrentSkipListMap基于跳表的有序映射,高并发高并发有序映射场景
ConcurrentSkipListSet基于跳表的有序集合,高并发高并发有序集合场景
BlockingQueue支持阻塞操作的队列生产者-消费者模型
Vector早期同步集合,性能较低不推荐使用
Hashtable早期同步映射,性能较低不推荐使用

根据具体需求选择合适的线程安全集合,可以提高程序的并发性能和可靠性。

THE END
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容