6. 线程池可用的各种高并发容器详解

容器使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnjjEgRA-1627493724132)(http://note.youdao.com/yws/res/6965/WEBRESOURCE8fe819d5312dac53f836fd62466aa885)]

collection:一个元素一个元素放入
Map:一对一对放入,entry对象
· Hashtable —> Concurrenthashmap
自带锁,老版本,基本不用
Vector/Hashtable(方法自带锁) ---> Hashmap ---> SynchionizedHashmap ---> Concurrenthashmap

Concurrenthashmap读取效率非常快
· Vector —> Queue
面试题:Queue和list的区别

1.Queue添加了许多对线程友好的API,offer,peek,poll;

2.BlockingQueue,又添加了两个put,take,实现阻塞,生产者消费者模型;
  • Vector
1.线程安全的容器,自带锁的,但是size()和remove()之间是没加锁的,也会超卖;

2.解决方法:在两个原子操作之外,在加一个锁,包含两个原子操作,但是效率不高;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k3Ymsguh-1627493724134)(http://note.youdao.com/yws/res/7010/WEBRESOURCE646847ee468248bce67da2551a52faec)]

  • ArrayList
线程不安全,会超卖
  • Queue
1.多线程容器多考虑Queue;

2.元素可重复考虑Queue,元素不可重复可以考虑set中的concurrent类的集合;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GWf9XCO6-1627493724135)(http://note.youdao.com/yws/res/7022/WEBRESOURCEb555b91d4f04b0cf90211384e1088694)]

Queue.poll()源码:
1.从头部removes一个元素;
2.如果为空值,则返回null;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-co9BHS9a-1627493724136)(http://note.youdao.com/yws/res/7024/WEBRESOURCEe840c59154a12c816012a1cb526844a7)]

3.实现是CAS代替无锁化,提高效率;

在这里插入图片描述

Q:CAS一定比Synchronized快吗?
A:
    1.根据多线程数,单线程就可以用Hashmap,多线程就得用concurrentHashMap 和 concurrentQueue
    2.线程执行不是特别长,可以用synchronized;

多线程常用的容器
  • concurrentHashMap 、treeMap、concurrentSkipListMap
TreeMap:使用的是红黑树,排序的;
因为concurrentHashMap里面用的是CAS操作,CAS用在tree的树上实现太复杂,
但是又需要一个排好序的,所以就有了concurrentSkipListMap(跳表概念);

跳表实现原理:

1.底层是一个链表,
2.拿出链表的一些关键元素在上方在做一个链表,
3.如果数据量大,就在做一层,
4.从上往下查找,就快了很多;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SqJd1qID-1627493724138)(http://note.youdao.com/yws/res/7074/WEBRESOURCE14df068d25a5947abaa8801a6c62d317)]

  • CopyOnWritedList 、CopyOnWritedSet
CopyOnWrited写时复制,
    写的线程少,写的时候需要赋值一个新的容器,所以写的效率特别低;
    读的线程特别多,没有锁,所以效率特别高;
    常用于写少读多的场景;

CopyOnWrited 源码解析:

  • 写:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0TvwJfWX-1627493724138)(http://note.youdao.com/yws/res/7090/WEBRESOURCE066932b07d3f089475d36d80ee88c186)]

  • 读(因为复制了,不需要加锁)

· BlockingQueue 阻塞队列

在这里插入图片描述

  • LinkedBlockingQueue (无界的)
put();一直装,满了会阻塞;
take();一直取,空了会阻塞;
天生的生产者消费者模式;
  • ArrayBlockQueue (有界的)
put();满了就会等待,程序阻塞;
add();满了就会抛异常,Queue full;
offer();满了就会等待,程序阻塞,但是有返回值boller;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6GHac3H-1627493724139)(http://note.youdao.com/yws/res/7114/WEBRESOURCE17d6bf164a321094e9f7563e43b3d99a)]

  • DelayQueue
按照在队列等待的时间排序,越短越先执行;

场景:按时间进行任务调度;
  • PriorityQueue
实现了排序;

内部是二叉树,小顶堆模式,小的在上和左;
  • SynchronousQueue(容量为0)
功能:
1.不是为了装内容的,是线程之间的通讯的,和之前HUC的exchanger类似;

方法:
2.take:线程阻塞;
  put:另外一条线程往进赋值;
  两个线程直接交换位置;
  前提必须有take阻塞,否则因为容量为0,就会异常:Queue full;
  
场景:
任务之间的调度;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gngMMgfL-1627493724140)(http://note.youdao.com/yws/res/7158/WEBRESOURCE6e937e2c03efd93d300c8805f9ec0942)]

  • TransferQueue
方法:
transfer:添加,然后阻塞,等待其他线程取走,在开始执行自己的;

场景:
等待一个结果返回之后,在继续执行;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值