Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • JAVA基础

  • 集合容器

    • HashMap
      • 1.简述HashMap扩容原理和多线程不安全
    • ConcurrentHashMap
  • Netty

  • JVM

  • JUC

  • Java
  • 集合容器
phan
2023-05-16
目录

HashMap

# HashMap

# 1.简述HashMap扩容原理和多线程不安全

JDK1.7:开辟一个更大的数组,并通过一个双层循环(有链表节点需要第二层循环,链表插入是头插法,因此拷贝过去后整个新链表会翻转)把原数组的节点完整拷贝过去。

多线程下可能会导致链表成环,出现while死循环。根本原因在于使用头插法。

JDK1.8:同1.7,区别在于链表插入使用了尾插法,且要拷贝的节点正好是一棵红黑树的根,那么要重新计算红黑树下每个节点对应在新数组下的索引下标位置(数组容量不同,下标不一定相同)。

并发执行put操作时,如果线程A未插入时就挂起,则当A重新获得时间片后直接插入,会出现数据覆盖情况。

编辑 (opens new window)
#JAVA基础
上次更新: 2023/12/15, 15:49:57
异步任务
ConcurrentHashMap

← 异步任务 ConcurrentHashMap→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式