首页 > 其他分享 >并发容器精讲——面试杀手锏

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

时间:2024-03-04 23:58:17浏览次数:39  
标签:容器 ConcurrentHashMap HashMap 队列 精讲 杀手锏 并发 线程

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

目录

并发容器概览

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(阻塞队列、非阻塞队列)

各并发容器总结

标签:容器,ConcurrentHashMap,HashMap,队列,精讲,杀手锏,并发,线程
From: https://www.cnblogs.com/shine-rainbow/p/18053047

相关文章

  • 多线程系列(十一) -浅析并发读写锁StampedLock
    一、摘要在上一篇文章中,我们讲到了使用ReadWriteLock可以解决多线程同时读,但只有一个线程能写的问题。如果继续深入的分析ReadWriteLock,从锁的角度分析,会发现它有一个潜在的问题:如果有线程正在读数据,写线程准备修改数据的时候,需要等待读线程释放锁后才能获取写锁,简单的说就是,读......
  • SpringCloud Alibaba-5-并发访问
    微服务架构应用设计目的为了应对高并发环境!1.什么是并发,并行并发:指在同一时间段内,多个任务或进程同时执行或交替执行的能力。并行:指多个任务在同一时间段内同时执行,需要多个处理器或多核处理器来实现。总的来说,并发更多地强调任务之间的交替执行,而并行更多地强调任务的同......
  • 「java.util.concurrent并发包」之 AQS
    AQS的原理是什么?AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的......
  • 并发编程之协程理论
    引言本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态。cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务......
  • 并发编程之asyncio模块
    引言Python中的协程:协程是一种轻量级的用户级线程,它在单线程内执行,不会阻塞主线程,可以在多个任务间轻松地切换,因此可以用于实现异步I/O操作。协程的实现方式与生成器非常相似,通过使用yield语句来暂停和恢复执行。协程可以与asyncio库配合使用,来实现异步I/O操作。这种方式可以......
  • 并发编程之Gevent模块
    Gevent的介绍greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库,那就是gevent。gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回......
  • 并发编程之IO模型
    引言Python的I/O模型分为同步(sync)和异步(async)两种:同步I/O模型是指,当一个线程在等待I/O操作完成时,它不能执行其他任务,需要一直等待I/O操作完成,直到接收到I/O操作的完成通知后才继续执行。异步I/O模型是指,当一个线程发起一个I/O操作后,不会等待I/O操作完成,而是直接执行其他任......
  • 并发编程补充:基于多线程实现并发的套接字通信
    服务端:fromsocketimport*fromthreadingimportThreaddefcommunicate(conn):whileTrue:try:data=conn.recv(1024)ifnotdata:breakconn.send(data.upper())exceptConnectionResetError:......
  • 并发编程补充:基于多进程实现并发的套接字通信
    服务端:frommultiprocessingimportProcessfromsocketimport*deftalk(conn):whileTrue:try:data=conn.recv(1024)ifnotdata:breakconn.send(data.upper())exceptConnectionResetError:......
  • 并发编程之定时器
    定时器定时器,指定n秒后执行某操作简易版:fromthreadingimportTimerdeftask(name):print('hello%s'%name)t=Timer(5,task,args=('xiao',))t.start()#helloxiao应用版:##验证码定时器fromthreadingimportTimerimportrandomclassCode:......