栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

并发集合详解concurrentHashMap、CopyOnWriteArrayList、阻塞队列

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

并发集合详解concurrentHashMap、CopyOnWriteArrayList、阻塞队列

文章目录
  • 前言
  • 常用map的关系图
  • hashmap线程不安全的体现?
    • 死循环问题分析
  • 红黑树
  • hashmap特点
  • jdk1.7的concurrenthashmap
  • jdk1.8的concurrenthashmap实现
  • 为什么超过8要转为红黑树?
  • 为什么使用concurrentHashmap,copyonwriteArraylist
  • copyonwriteArrayList使用场景
    • ArrayList迭代修改报错原因?
  • copyonwriteArrayList缺点
  • copyonwriteArrayList源码
  • 从以下几点讲
  • 队列
  • 什么是阻塞队列
  • 阻塞队列的主要方法
  • ArrayBlokingQueue
  • LinkdedBlokingQueue
  • # PriorityBlokingQueue
  • SynchronousQueue
  • 非阻塞队列

前言

本篇文章是在慕课网学习记的笔记,写的匆忙,内容有些乱,有问题欢迎留言。

常用map的关系图


虚线代表实现
实线代表继承

hashmap线程不安全的体现?
  1. 同时put碰撞导致数据丢失
  2. 同时put扩容导致数据丢失
  3. 死循环导致cpu100%
死循环问题分析

在多个线程同时扩容的时候,会造成链表的死循环,相互指向,没有尽头,从而抛出outofmemory。

红黑树


所有的叶子节点都是黑色的

hashmap特点
  1. 线程不安全
  2. 迭代式不允许修改内容
  3. 只读的并发是安全的
jdk1.7的concurrenthashmap

segment代表块

jdk1.8的concurrenthashmap实现


每个节点是一个node,使用CAS+synchronized实现线程安全

为什么超过8要转为红黑树?
  1. 首先链表占用的空间更小
  2. 想要达到冲突为8,概率非常小,根据hashmap源码的注释,依据泊松分布,达到8的概率小于千分之一
为什么使用concurrentHashmap,copyonwriteArraylist

因为锁的粒度太大,很多都是synchronized加在方法上,导致多个方法共用一把锁,效率太低,并且迭代的时候没法编辑。

copyonwriteArrayList使用场景

读操作尽可能的快,写操作慢点没关系

写的时候再copy一份内存,在新的里面进行添加删除等操作,结束之后,再把容器的引用指向新的。
读的时候是旧的,写的时候是新的,可以同步进行,提高了并发效率,可以同步进行。
读写分离的思想。
写写时使用reentrantlock

但是迭代的时候数据可能是过期的

ArrayList迭代修改报错原因?

迭代器的next方法中,首先进行检测 。

copyonwriteArrayList缺点

copyonwriteArrayList源码

使用Arrays.copyof,新复制一份

从以下几点讲


队列

什么是阻塞队列

带有阻塞功能的队列




阻塞队列的主要方法


put: 如何队列满了,会阻塞住
take:如果队列空了,会阻塞住

add: 如果队列满了,会抛出异常
remove: 如果队列空了,再remove会抛出异常

offer:如果满了,再offer,会返回false
poll:如果空,再poll,会删除,会返回false
peek:取出来,但不会删除

ArrayBlokingQueue

LinkdedBlokingQueue

无界

# PriorityBlokingQueue

无界,会进行扩容

SynchronousQueue

容量为0

因为不做存储,所以效率很高

非阻塞队列

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936143.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号