gball个人知识库
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)

ggball

后端界的小学生
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)
  • 面试

  • 数据库

  • linux

  • node

  • tensorFlow

  • 基础组件

  • 基础知识

    • java集合

      • 概览
      • hashMap解读
      • concurrentHashMap解读
        • JDK1.7
        • JDK1.8
    • jvm调优

    • java并发编程

    • java网络编程

    • java8新特性

    • javaAgent

    • java高级

  • 算法与设计模式

  • 分布式

  • 疑难杂症

  • go学习之旅

  • 极客时间

  • 知识库
  • 基础知识
  • java集合
ggball
2021-05-31

concurrentHashMap解读

# JDK1.7

具有分段锁机制,提高并发执行效率,每个段中使用可重入锁进行加锁,

20230531224520 put流程:

  1. 根据key的hash值求得segment的位置,trylock()或者scanAndLockForPut()获得segment的锁,再利用hash值,求得桶的下标位置
  2. 如果桶位置首个节点为空,则直接复值,如果不为空,则继续遍历
  3. 比较key和hash值,如果相等,则替换,遍历到最后都不相等,直接添加到链表头部
  4. 查看是否满足扩容条件,满足则扩容,不满足则结束
  5. 释放segment锁

scanAndLockForPut 作用就是获取segment的锁,先利用cas,再用lock()(阻塞的),知道获取到锁。

# JDK1.8

20230531224532 数组,链表,红黑树,利用cas和synchronized

put流程

  1. 根据key的hash值获取到桶的位置,如果桶的首个节点为空,则利用cas赋值
  2. 如果桶的首个节点不为空,则进行链表操作或者红黑树上的节点添加,过程中已经加上了synchronized关键字
上次更新: 2025/06/04, 15:06:15
hashMap解读
JVM大纲

← hashMap解读 JVM大纲→

最近更新
01
AIIDE
03-07
02
githubActionCICD实战
03-07
03
windows安装Deep-Live-Cam教程
08-11
更多文章>
Theme by Vdoing
总访问量 次 | 总访客数 人
| Copyright © 2021-2025 ggball | 赣ICP备2021008769号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×

评论

  • 评论 ssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
×