大话ConcurrentHashMap的put,get过程
put
最最最一开始得检查桶是否进行初始化,然后确定判断所放桶中是否有元素,没有元素的话,那么就用CAS的方式添加元素,当然有可能失败,有可能其他线程已经抢占先添加,这个过程在一个死循环里,失败了再从头来一次,判断桶是否初始化,桶内是否有元素等等,如果此时桶内有元素了,那么判断桶内第一元素的hash值是否为MOVED,说明正在扩容,那么此线程就会帮助扩容,如果不是的话,那么就对一个元素synchronized上锁,上锁之后还要对桶内第一个元素判断是否发生了改变,发生变化了就再从头再来。我对再次判断桶内第一个元素的理解:如果在加锁的时候,此时有可能其他线程删除了第一个元素,那么就产生了错误。经历了重重困难终于能插入数据了,此时就和HashMap有点像了,如果第一元素是链表节点,那么遍历链表查询是否key相等,若查到把value更改为我们要put的value值,没找到的话新建节点插入到链表尾部。若第一个节点是树节点,那么就以树的方式插入。
get
检查桶的长度是否为空,或者根据key得到具体哪个桶中没有数据,那么直接返回null,如果桶不为空且要查询的桶中有元素,那么桶中第一个元素的hash值如果大于0说明为链表节点,那么遍历链表查询即可,小于0说明是树节点或者正在扩容,那么调用Node子类的find函数进行查询。
TIP:hash值大于0说明是链表节点,小于0说明在在迁移或者是树
大话ConcurrentHashMap的put,get过程相关推荐
- 大话TreeMap的put,get过程
get 首先会判断在初始化TreeMap的时候是否传入了外部选择器Comparator,如果传入了,那么利用Comparator遍历整棵树,找到要存放的位置,利用Comparator的compare( ...
- 大话HashMap的put,get过程
put 最先判断桶的长度是否为0,为0的话则需要先对桶进行初始化操作,接着,求出hashcode并通过扰动函数确定要put到哪个桶中,若桶中没有元素直接插入,若有元素则判断key是否相等,如果相等的话 ...
- 面试之Hashtable和ConcurrentHashMap
那么要如何保证HashMap的线程安全呢? 方法有很多,比如使用Hashtable或者Collections.synchronizedMap,但是这两位选手都有一个共同的问题:性能.因为不管是读还是写 ...
- java面试之HashMap延伸出来的--什么是ConcurrentHashMap?
1.HashMap是线程安全的吗? 2 2答–ConcurrentHashMap 3 要学习多线程编程的话,ConcurrentHashMap的源码拿来阅读一下,不失为一个好的学习方法. Segmen ...
- ConcurrentHashMap(JDK1.8)put分析(一)
目录 ConcurrentHashMap整体结构 1.计算hash值 2.initTable 2.1初始化table 2.2 关于CAS 2.3思考 3.通过hash值定位key-value位置 4. ...
- 全网最细 | 21张图带你领略集合的线程不安全
来源 | 悟空聊架构(ID:PassJava666) 本篇主要内容如下: 本篇主要内容 本篇所有示例代码已更新到 我的Github 本篇文章已收纳到我的Java在线文档 集合,准备团战 一.线程不安全 ...
- 超详细 | 21张图带你领略集合的线程不安全
来源 | 悟空聊架构 本篇主要内容如下: 本篇主要内容 本篇所有示例代码已更新到 我的Github 本篇文章已收纳到我的Java在线文档 线程不安全之ArrayList 集合框架有Map和Collec ...
- Java全链路复习面经-基础篇(2.5万字全文)
序言 主要分为两篇,一篇基础篇,涵盖Java基础,数据库,JVM,计算机网络等知识 另一篇为框架篇,主要为流行框架,如Spring.SpringMVC.Mybatis.SpringBoot.Sprin ...
- 阿里二面准备(Java 研发)
感觉有机会进行二面(原谅我没来由的自信,--),准备一下.参考了牛客网上 30 多个面经帖,这是目前我能找到的几乎所有的问题.私以为如果能全部掌握,基本就能收割 offer 了.时间有限的话,针对自己 ...
最新文章
- Netty学习笔记(二) 实现服务端和客户端
- 关于Jquery中ajax方法data参数用法的总结
- 从零开始学习docker(四)host
- xp系统蓝屏代码7b_遇到系统问题,三种常见处理方法你更pick谁
- 在24小时内学完所有的数学是种什么体验?我们做了这个大胆的尝试……
- Rails之格式化价格方法
- Flutter Curves 动画曲线合辑
- 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念...
- dbcc收缩数据库_使用DBCC SHRINKFILE收缩数据库
- C++ Licence认证用于项目开发和设备认证
- 启动hadoop输入jps显示:程序 ‘jps‘ 已包含在下列软件包中: * openjdk-7-jdk * openjdk-6-jdk 请尝试:sudo apt-get install ~
- hdu 1251(字典树)
- vue前端项目富文本应用
- 树莓派控制PCF8591 AD/DA模块
- 最短路问题的线性规划模型
- Qualcomm 音频学习一
- 通俗易懂告诉你CPU/GPU/TPU/NPU...都是什么意思?
- 锁定计算机屏幕的快捷键是什么,计算机屏幕锁定的快捷键是什么? -计算机
- 生信笔记 | 探索PubMed数据库文献
- Js逆向教程17-极验滑块 实现加密算法的逻辑