面试题:综合简述Java哪些集合类是线程安全的 ?

在Java中,集合框架提供了多种集合类,其中一部分是线程安全的,可以在多线程环境下使用。以下是常见的线程安全集合类:


1. 早期的线程安全集合类(位于java.util包)

这些集合类通过使用synchronized关键字实现线程安全,但性能较低,适合低并发场景。

  • Vector
    • 线程安全的动态数组。
    • 所有方法都被synchronized修饰。
    • 性能较差,通常被ArrayListCollections.synchronizedList替代。
  • Hashtable
    • 线程安全的哈希表。
    • 所有方法都被synchronized修饰。
    • 不允许null键或null值。
    • 性能较差,通常被HashMapConcurrentHashMap替代。
  • 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
    • 线程安全的无界非阻塞双端队列。

总结

  • 早期线程安全集合VectorHashtableStack(性能较差,不推荐使用)。
  • Collections工具类包装的集合synchronizedListsynchronizedSetsynchronizedMap(适合低并发场景)。
  • java.util.concurrent包中的并发集合ConcurrentHashMapCopyOnWriteArrayListBlockingQueue等(适合高并发场景,推荐使用)。
THE END
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容