Fork me on Gitee

并发容器精讲——面试杀手锏

并发容器精讲——面试杀手锏

并发容器概览

image-20240304223107546

image-20240304223206025

  • ConcurrentHashMap:线程安全的HashMap

  • CopyOnWriteArrayList:线程安全的List

  • BlockingQueue:这是一个接口,表示阻塞队列,非常适用于作为数据共享的通道

趣说集合类的历史——古老和过时的同步容器

  • Vector和HashTable(原理都是用synchronized修饰)

    • 早期JDK
    • 并发性能差
  • HashMap和ArrayList

    • 虽然这两个类不是线程安全的,但是可以用Collections.synchronizedList(new ArrayL:ist)和==Collections.synchronizedMap(new HashMap:ist<K,V>)使之变成线程安全的
  • ConcurrentHashMap和CopyOnWriteArrayList

    • 取代同步的HashMap和同步的ArrayList
    • 绝大多数并发情况下,ConcurrentHashMap和CopyOnWriteArrayList的性能都要好。

ConcurrentHashMap(重点、面试常考)

image-20240304224911763

为什么HashMap是线程不安全的?

  • 同时put碰撞导致数据丢失

​ 两个线程同时put某一个桶内数据,会导致只有一个put成功

  • 同时put扩容导致数据丢失
  • 死循环造成的CPU100%
    • HashMap在高并发下的死循环(仅在JDK1.7及以前存在):多线程同时扩容时,可能造成循环链表,导致CPU 100%

HashMap 1.7结构

image-20240304231712652

HashMap 1.8结构

image-20240304232016361

image-20240304231838052

image-20240304231916620

HashMap关于并发的特点

  • 非线程安全
  • 迭代时不允许修改内容
  • 只读的并发是安全的
  • 如果一定要线程安全,需要借助Collections.synchronizedList

JDK 1.7 ConcurrentHashMap实现和分析

image-20240304232218619

JDK1.8的ConcurrentHashMap实现和分析

  • 简介
  • 结构图

image-20240304232407500

image-20240304232918708

image-20240304232941307

并发队列Queue(阻塞队列、非阻塞队列)

各并发容器总结

posted @ 2024-03-04 23:41  shine-rainbow  阅读(4)  评论(0编辑  收藏  举报