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过程相关推荐

  1. 大话TreeMap的put,get过程

    get 首先会判断在初始化TreeMap的时候是否传入了外部选择器Comparator,如果传入了,那么利用Comparator遍历整棵树,找到要存放的位置,利用Comparator的compare( ...

  2. 大话HashMap的put,get过程

    put 最先判断桶的长度是否为0,为0的话则需要先对桶进行初始化操作,接着,求出hashcode并通过扰动函数确定要put到哪个桶中,若桶中没有元素直接插入,若有元素则判断key是否相等,如果相等的话 ...

  3. 面试之Hashtable和ConcurrentHashMap

    那么要如何保证HashMap的线程安全呢? 方法有很多,比如使用Hashtable或者Collections.synchronizedMap,但是这两位选手都有一个共同的问题:性能.因为不管是读还是写 ...

  4. java面试之HashMap延伸出来的--什么是ConcurrentHashMap?

    1.HashMap是线程安全的吗? 2 2答–ConcurrentHashMap 3 要学习多线程编程的话,ConcurrentHashMap的源码拿来阅读一下,不失为一个好的学习方法. Segmen ...

  5. ConcurrentHashMap(JDK1.8)put分析(一)

    目录 ConcurrentHashMap整体结构 1.计算hash值 2.initTable 2.1初始化table 2.2 关于CAS 2.3思考 3.通过hash值定位key-value位置 4. ...

  6. 全网最细 | 21张图带你领略集合的线程不安全

    来源 | 悟空聊架构(ID:PassJava666) 本篇主要内容如下: 本篇主要内容 本篇所有示例代码已更新到 我的Github 本篇文章已收纳到我的Java在线文档 集合,准备团战 一.线程不安全 ...

  7. 超详细 | 21张图带你领略集合的线程不安全

    来源 | 悟空聊架构 本篇主要内容如下: 本篇主要内容 本篇所有示例代码已更新到 我的Github 本篇文章已收纳到我的Java在线文档 线程不安全之ArrayList 集合框架有Map和Collec ...

  8. Java全链路复习面经-基础篇(2.5万字全文)

    序言 主要分为两篇,一篇基础篇,涵盖Java基础,数据库,JVM,计算机网络等知识 另一篇为框架篇,主要为流行框架,如Spring.SpringMVC.Mybatis.SpringBoot.Sprin ...

  9. 阿里二面准备(Java 研发)

    感觉有机会进行二面(原谅我没来由的自信,--),准备一下.参考了牛客网上 30 多个面经帖,这是目前我能找到的几乎所有的问题.私以为如果能全部掌握,基本就能收割 offer 了.时间有限的话,针对自己 ...

最新文章

  1. Netty学习笔记(二) 实现服务端和客户端
  2. 关于Jquery中ajax方法data参数用法的总结
  3. 从零开始学习docker(四)host
  4. xp系统蓝屏代码7b_遇到系统问题,三种常见处理方法你更pick谁
  5. 在24小时内学完所有的数学是种什么体验?我们做了这个大胆的尝试……
  6. Rails之格式化价格方法
  7. Flutter Curves 动画曲线合辑
  8. 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念...
  9. dbcc收缩数据库_使用DBCC SHRINKFILE收缩数据库
  10. C++ Licence认证用于项目开发和设备认证
  11. 启动hadoop输入jps显示:程序 ‘jps‘ 已包含在下列软件包中: * openjdk-7-jdk * openjdk-6-jdk 请尝试:sudo apt-get install ~
  12. hdu 1251(字典树)
  13. vue前端项目富文本应用
  14. 树莓派控制PCF8591 AD/DA模块
  15. 最短路问题的线性规划模型
  16. Qualcomm 音频学习一
  17. 通俗易懂告诉你CPU/GPU/TPU/NPU...都是什么意思?
  18. 锁定计算机屏幕的快捷键是什么,计算机屏幕锁定的快捷键是什么? -计算机
  19. 生信笔记 | 探索PubMed数据库文献
  20. Js逆向教程17-极验滑块 实现加密算法的逻辑

热门文章

  1. 数据库相关中间件收录集
  2. 微博客户端播放器的演进之路
  3. Zoom的Web客户端与WebRTC有何不同?
  4. 设计模式C++实现(7)——观察者模式
  5. Linux 入门必看:如何60秒内分析Linux性能
  6. 【报名中】数据库大咖们与你聊聊云上实践的那些事儿
  7. 腾讯觅影:AI+医疗不光能诊断癌症,还可以很公益
  8. PMP之敏捷图表之产品地图VS产品路线图
  9. 解决gradle下载慢的问题
  10. 来来来,大家说一下CPU!【关于 CPU 的一些基本知识总结】