- 前言
- 常用map的关系图
- hashmap线程不安全的体现?
- 死循环问题分析
- 红黑树
- hashmap特点
- jdk1.7的concurrenthashmap
- jdk1.8的concurrenthashmap实现
- 为什么超过8要转为红黑树?
- 为什么使用concurrentHashmap,copyonwriteArraylist
- copyonwriteArrayList使用场景
- ArrayList迭代修改报错原因?
- copyonwriteArrayList缺点
- copyonwriteArrayList源码
- 从以下几点讲
- 队列
- 什么是阻塞队列
- 阻塞队列的主要方法
- ArrayBlokingQueue
- LinkdedBlokingQueue
- # PriorityBlokingQueue
- SynchronousQueue
- 非阻塞队列
本篇文章是在慕课网学习记的笔记,写的匆忙,内容有些乱,有问题欢迎留言。
常用map的关系图
虚线代表实现
实线代表继承
- 同时put碰撞导致数据丢失
- 同时put扩容导致数据丢失
- 死循环导致cpu100%
在多个线程同时扩容的时候,会造成链表的死循环,相互指向,没有尽头,从而抛出outofmemory。
红黑树
所有的叶子节点都是黑色的
- 线程不安全
- 迭代式不允许修改内容
- 只读的并发是安全的
segment代表块
每个节点是一个node,使用CAS+synchronized实现线程安全
- 首先链表占用的空间更小
- 想要达到冲突为8,概率非常小,根据hashmap源码的注释,依据泊松分布,达到8的概率小于千分之一
因为锁的粒度太大,很多都是synchronized加在方法上,导致多个方法共用一把锁,效率太低,并且迭代的时候没法编辑。
copyonwriteArrayList使用场景读操作尽可能的快,写操作慢点没关系
写的时候再copy一份内存,在新的里面进行添加删除等操作,结束之后,再把容器的引用指向新的。
读的时候是旧的,写的时候是新的,可以同步进行,提高了并发效率,可以同步进行。
读写分离的思想。
写写时使用reentrantlock
但是迭代的时候数据可能是过期的
ArrayList迭代修改报错原因?迭代器的next方法中,首先进行检测 。
使用Arrays.copyof,新复制一份
从以下几点讲
带有阻塞功能的队列
put: 如何队列满了,会阻塞住
take:如果队列空了,会阻塞住
add: 如果队列满了,会抛出异常
remove: 如果队列空了,再remove会抛出异常
offer:如果满了,再offer,会返回false
poll:如果空,再poll,会删除,会返回false
peek:取出来,但不会删除
无界
# PriorityBlokingQueue无界,会进行扩容
SynchronousQueue容量为0
因为不做存储,所以效率很高



