Java学习总结(1.3.3) 并发容器类2
并发容器类list_set_queue
ConcurrentSkipListMap
以空间换时间,提高查找效率。
key是有序的
concurrent线程安全的,适合在是发场量下用。
TreeMap线程不安全
List:
CopyOnWriteArrayList容器即写时复制的容器。和 ArrayList比较,优点是并发安全,缺点有两个
1、多了内存占用:写数据是copy一份完整的数据,单独进行操作。占用双份内存。
2、数据一致性:数据写完之后,其他线程不一定是马上读取到最新内容。
ArrayList 使用的数组来做存储
数组是定长的,ArrayList怎么实现一个不定长的?
add方法中,用扩容的方式实现。
第一次为10,每次扩容为原来的1.5倍。
Copywrite思想
互斥锁并发度很低句话概括读写锁的作用:提高互斥锁的性能
存在一个问题:
1.读很多的时候,写容易被饿死
2.假如拿到写锁?大量的读就被阻塞,不希望看到这样的情况
怎么解决这个问题呢?
Copywrite:
copyOnWrite在我写时,仍然可以读并且读到的不是脏数据
问题:数据存在一定的延时每次写,都复制,浪费资源吗?
会,以空间换时间大量的读,非常少量的写
只要是写:导致内存你的翻倍,很容易OOM
===========================
Hashset 基于Hashmap实现 非线程安全
CopyOnWriteArraySet 基于CopyOnWriteArrayList 线程安全
ConcurrentSkipListSet 基于ConcurrentSkipListMap 线程安全,有序,查询快
set 实际上是数学概念
集合:无序的、不重复
有序可以看做无序的特殊情况
Hashset数据到底有没有顺序实现的时候, 没有刻意打乱顺讯, 也没有可以保证顺序, 顺序没有保障.
Set集合
Set和List重要区别: 不重复
Hashset使用 Hashmap实现的,怎么实现的呢?
Hasmmap key不重复, Hashset元素不重复
CopyOnWriteArraySet Set不能重复
CopyOnWriteArrayList List可以重复
顺序不用关心,
============================================
Queue API
Queue-队列数据结构的实现。分为阻塞队列和非阻塞队列。下列的蓝色区块,为阻塞队列特有方法。
方法 | 作用 | 描述 |
add | 增加一个元素 | 如果队列已满,则抛出一个 Illegal Slabeepeplian异常 |
remove | 移除并返回队列头部的元素 | 如果队列为空,则抛出一个 Nosuchelementexception异常 |
element | 返回队列头部的元素 | 如果队列为空,则抛出一个 Nosuchelementexception异常 |
offer | 添加一个元素并返回true | 如果队列已满,则返回 False |
poll | 移除并返问队列头部的元素 | 如果队列为空,则返回null |
peek | 返回队列头部的元素 | 如果队列为空,则返回null |
put | 添加一个元素 | 如果队列满,则阻塞 |
take | 移除并返回队列头部的元素 | 如果队列为空,则阻塞 |
-------------------------------------------
ArrayBlockingQueue
线程安全, 阻塞。
从名称可以判断数据结构: Array数组。
如何用数组实现一个 queue: 循环数组来实现一个 queue, 类似Contion。
什么是阻塞,contion线程挡土挂起。
LinkedBlocingQueue 链表
ConcurrentLinkedQueue
在并发场景下使用,线程安全, 无阻塞。
CAS 无锁编程。
CAS不能够保障性能绝对的好,可以保障我一个程序把资源占有的更多,单个程序性能一定更好。
SychronousQueue
同步队列,容量为0
put没有容量了,阻塞,当有poll、take取元素时。结束阻塞。
offer 元素直接丢掉。
如果有take阻塞中, offer也会成功
take阻塞,当有put、ofer方法结束阻塞poll直接返回null
如果有一个put方法阻塞着,poll不返回null
PriorityBlockingQueue
打破了先进先出的规则,优先级列中有也优先级规则。
优先级可以理解为排序,排序则,指定优先级
- 上一篇: Java学习总结(1.3.2) 并发容器类
- 下一篇: Java学习总结(1.3.4) 并发工具类详解
每日一句
博客分组
标签云
- 最近综合
- 情绪巨婴是什么 12.18
- 普通蛋糕做法 05.31
- 玉米烤肠芝士面包做法 05.31
- Mysql安装教程 - 绿色版 06.18
- 我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
- Typora开发版⽆法使⽤解决⽅法 05.04
- 为什么无知者越自信? -- 达克效应 05.10
- 马斯洛需求层次理论 04.29
- 随机综合
- 普通蛋糕做法 05.31
- 中间件1.2.1-ActiveMQ入门 04.22
- Zebra斑马 888-TT打印机的EPL命令的详细说明 08.31
- 鸿蒙HarmonyOS DevEco Studio的安装教程 和 第一个项目 04.15
- Java学习总结(1.3.3) 并发容器类2 04.09
- android TextView标签字体加粗的几种方法 04.08
- Java学习总结(2.2.2) 责任链模式 04.20
- Java学习总结(1.3.2) 并发容器类 04.07