java理论知识汇总-集合篇

关于List、Set

手画Collection结构图(Vector和Stack已经废弃

集合框架图.png
Collection思维导图

Collection下集合的类关键词

  • List 有序,可重复集合
  • Set 无序,不可重复集合
  • Queue 先进先出队列
  • Deque 双向队列
  • Array 数组方式实现,内存上不连续
  • Linked 链表方式实现,内存上连续
  • CopyOnWrite 采用写入时复制技术
  • SkipList 采用跳表技术提高搜索效率
  • Concurrent 非阻塞的方式实现线程安全
  • Blocking 阻塞方式实现线程安全

Collection下哪些是线程安全的?

  • CopyOnWrite系列:CopyOnWriteArrayList、CopyOnWriteArraySet
  • Concurrent系列:ConcurrentLinkedQueue、ConcurrentLinkedDeque、ConcurrentSkipListSet
  • Blocking系列:ArrayBlockingQueue、LinkedBlockingQueue、LinkedBlockingDeque、DelayQueue、SynchronousQueue、PriorityBlockingQueue

ArrayList和LinkedList的差异

  • 结构上:ArrayList数组实现,内存连续,LinkedList 链表实现,内存不连续
  • 在随机访问上:ArrayList更快
  • 插入/删除:LinkedList更快

ArrayList是如何扩容的

  • 计算最小需要空间
  • 判断是否需要扩容
  • 扩容到原来的1.5倍
  • 使用System.arraycopy方法将数据复制到新的内存空间

ArrayList扩容因子为什么是1.5倍

真实的倍数为oldCapacity + (oldCapacity >> 1),约等于1.5倍,这么设计应该是出于位运算性能的考虑。

fast-fail机制

  • 对集合的每一次增删操作都会增加modCount的值
  • iterator遍历集合前会记录该值
  • 调用next方法时会校验该值是否发生改变,如果改变抛出并发修改异常。

fast-fail机制常发生在哪些场景

  • 多线程对Util包下集合的并发操作(可通过使用CopyOnWrite系列类)
  • 遍历集合的同时进行增删操作(可通过使用Iterator的增删方法)
  • subList后对主列表的增删,将导致子列表的遍历、增、删报错

并发容器CopyOnWrite系列类

  • 读写分离,如果是写操作,则复制一个新集合,在新集合内添加或删除元素。待一切修改完成之后,再将原集合的引用指向新的集合
  • 扩容的空间代价比较大
  • 使用批量添加或删除方法
  • 适用于读多写极少的情况

关于队列

各队列特点

队列 数据结构 是否有界 线程安全
ArrayBlockingQueue 数组 ReentrantLock保证出入队线程安全
LinkedBlockingQueue 链表 出入队锁分别使用ReentrantLock
DelayQueue 二叉堆 同上
PriorityBlockingQueue 二叉堆 同上
SynchronousQueue 队列或堆栈 - CAS保证出入队线程安全

队列方法

方法名 描述 备注
add 增加一个元索 如果队列已满,则抛出异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出异常
element 返回队列头部的元素 如果队列为空,则抛出异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞

ArrayBlockingQueue 入队代码流程

  • 获取锁
  • 判断是否已满,满则等待
  • 加入数组
  • 唤醒出队线程

为什么ArrayBlockingQueue单锁实现,而LinkedBlockingQueue是双锁。

PriorityBlockingQueue入队流程

  • 获取锁
  • 自旋判断队列容量是否足够,不足时扩容
  • 二叉堆排序
  • 唤醒出队线程

PriorityBlockingQueue扩容机制

  • 扩容大小,小于64时约为2倍,大于64时约为1.5倍
  • 默认大小,11
  • 通过自旋CAS加锁后再进行扩容

DelayQueue 入队流程

  • 加锁
  • 加入PriorityBlockingQueue队列
  • 判断刚加入的是否为队首
  • 是则leader设置为空,唤醒一个线程
  • 释放锁

DelayQueue出队流程

  • 加锁
  • 取队首,判断是否到了执行时间,是则唤醒其他线程、释放锁并返回
  • 如果已经有leader,则永久等待
  • 如果没有leader,则晋升为leader,等待直到队首的执行时间
  • 释放锁

DelayQueue的重点

  • 底层依赖PriorityBlockingQueue
  • 入队的数据必须实现Delayed接口
  • leader的作用,多个消费者线程同时用take方法去取时,只有一个线程能成为leader,其他的会由于leader不为空 ,而永久等待。

SynchronousQueue的重点

  • 容量为0
  • 匹配插入线程和移除线程,资源从插入线程移交给移除线程
  • 有公平模式(先进先出队列)和非公平模式(先进后出栈)
  • 适合作为管道,资源从一个线程传递给另一个线程

ConcurrentLinkedQueue 核心

  • 不允许null入列,因为尾节点的定位是通过next是否为null判断的
  • 底层使用cas包装入列出列安全。
  • head节点跟tail不一定指向头节点或尾节点,可能存在滞后性。
  • size方法是通过遍历获取的,当同时存在其他线程入队出队操作时,该值可能不精确。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,698评论 6 539
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,202评论 3 426
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,742评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,580评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,297评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,688评论 1 327
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,693评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,875评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,438评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,183评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,384评论 1 372
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,931评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,612评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,022评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,297评论 1 292
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,093评论 3 397
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,330评论 2 377

推荐阅读更多精彩内容