惜当下 展望未来!珍

并发容器(粗略)

并发容器

1.概述

为了线程池做准备,线程池里有一个参数就是用并发容器来做你工作任务的容器。

容器分类

容器

从物理结构来说,数据结构就两种

  • 数组

  • 链表

从逻辑结构来说,就很多了

为啥有了List,Set,后面还要加一个Queue?

List,Set就是用来普通装东西的,Queue主要是为高并发准备的

2.ConcurrentHashMap

发展:从HashTable到ConcurrentHashMap

jdk1.0: 就两个容器 Vector(collection) HashTable(map) 所有方法都加了sychronized,目前基本不用

后面加了:

  • HashMap(所有方法都没加锁)---》
  • 工具类Collections.synchronizedCollection(new HashSet<>()),底层还是 sychronized,只是用了sychronized锁一个对象,可以调节锁的粒度。
  • ConcurrentHashMap(效率主要提高在并发读上面 效率很高 )

3.Vector到Queue的发展

多线程操作collection容器时 多考虑QUEUE少考虑List

ConcurrentLinkedDeque---》原子性是通过CAS实现

4.经常在多线程情况下使用的容器

  • **map: **

    • ConcurrentHashMap

    • ConcurrentSkipListMap(跳表实现,可以排序 )

  • collection:

    • copyOnWriteArrayList 写时复制一个数组往后添加,完成后原来的引用指向新的数组。(读不加锁 写加锁),适合读多写少的场景‘

    • copyOnWriteArrayList

    • BlockingQueue(接口) --- 提供了许多对多线程场景支持,友好的API(Queue和List区别)

      • LinkedBlockingDeque:无界,可以一直添加(但是不能超过int的最大值),  put take方法会阻塞
        
        ArrayBlockingQueue  有界,put阻塞  add抛异常 offer不会抛异常,返回true或者false
        
        
        

TreeMap:排好序的 用的红黑树(查找比较快 插入相率也相对没那么低),

为什么没有ConcurrentTreeMap?

  • ConcurrentHashMap 用的CAS操作,这个CAS用在红黑树结构的话实现太复杂……
  • 所以用了跳表结构ConcurrentSkipListMap 在高并发下来替代 TreeMap, 排好序

跳表结构:

  • 查找比链表快很多 CAS的实现难度比TreeMap小很多

image-20220927005033326

5.阻塞队列中比较特殊的几个队列

特殊的QUeue

PriorityQueue(非阻塞队列)  :  添加的时候会默认排序(小到大)  二叉树   

BlockingQueue(接口):
   DelayQueue 按时间进行任务调度

	SynchronousQueue  容量为0..  不能装东西  阻塞  使用场景:线程直接交换数据,交换不到的话就一直阻塞  

	TransferQueue:装了一个数据后 会阻塞,等着这个数据被消费  才会继续往下执行 (你付了钱我再走)
 
posted @   嘿嘿-  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示

目录导航