HashMap:非安全容器(实现结构、安全性问题)

多线程下的问题:
JDK1.7头插法–>死循环
JDK1.8尾插法–>数据覆盖

1.JDK1.7死循环(非常重要!!!)
死循环出现在HashMap扩容时,负载因子:0.75(HashMap性能最高),HashMap默认大小为16,当容量大于等于0.75*16时进行扩容,默认2倍扩容

源码分析:
HashMap–>put()–>resize()–>transfer()【转移:将数组的值转移到新扩容的数组里;for循环的是数组,while循环的是链表】

单线程下是安全的

多线程下是线程不安全的

假设线程1在e1指向A,next1指向B时,时间片用完了,然后线程2执行完,线程1再继续执行

线程1在线程2的基础上执行

第一次循环执行结束,为下图:

第二次循环执行完,为下图:

第三次循环:在执行

该步骤时,A又指向了B,发生了死循环

2.HashMap的安全版本:ConcurrentHashMap
(1)ConcurrentHashMap实现线程安全的原理是在进行插入操作的时候(put方法),会在进入方法之后加锁,并且在操作完成之后释放锁,所以不会有线程安全的问题。(这是JDK1.7,JDK1.8使用的是synchronized)

(2)ConcurrentHashMap优化:是将HashMap分成多个sengment,对每个sengment分别加锁,这样就可以保证,多线程如果操作的不是同一个sengment就不需要进行排队处理了,从而提高了程序的执行效率。
sengment分段锁:锁粒度更小,性能更高。

(3)HashMap是非线程安全的
HashTable是线程安全的,整体给对象进行加锁

HashMap不安全!!!详细分析及解决方案相关推荐

  1. HashMap 源码详细分析(JDK1.8)

    1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...

  2. HashMap 源码详细分析(JDK1.8) 1

    1.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...

  3. java内部类gc_Java内部类持有外部类的引用详细分析与解决方案

    在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收. GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法),内部类在生命 ...

  4. LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  5. linkedhashmap 顺序_LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  6. HashMap 源码深度分析

    HashMap 源码分析 在Map集合中, HashMap 则是最具有代表性的,也是我们最常使用到的 Map 集合.由于 HashMap 底层涉及了很多的知识点,可以比较好的考察一个人的Java的基本 ...

  7. HashMap实现原理和源码详细分析

    HashMap实现原理和源码详细分析 ps:本博客基于Jdk1.8 学习要点: 1.知道HashMap的数据结构 2.了解HashMap中的散列算法 3.知道HashMap中put.remove.ge ...

  8. JAVA内存泄露分析和解决方案及WINDOWS自带查看工具

    JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...

  9. 【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★

    文章目录 一. 常用的耗时方法优化方案 ( 重要 ) 二. 源码分析梳理 1. 应用启动时间计算相关源码分析 2. Launcher 应用中启动 Android 应用流程 三. 启动白屏解决方案 An ...

最新文章

  1. elasticsearch外网访问
  2. java runnable main_Java 线程类问题写一个线程类MyThread,该线程实现了Runnable接口,写一个main方法, * 用for循...
  3. jQuery将不再支持IE6/7/8
  4. kafka分区(partition)和和分组(group)
  5. Spring 异步调用,一行代码实现!舒服,不接受任何反驳~
  6. thymeleaf 学习笔记
  7. 注解方式使用 Redis 缓存
  8. 文件包含常见绕过方法
  9. mac boot2docker certs not valid with 1.7
  10. 栈——后缀表达式(洛谷 P1449)
  11. 为何优秀的程序员不断离开?| 畅言
  12. STM32固件库编成基础教程
  13. ASIC 与FPGA比较谈
  14. 阳线双响炮K线形态,上升势不可挡,送指标源码
  15. vue项目打包出错:Unexpected token arrow «=>», expected punc «,» [static/js/chunk-1558f5a0.b64bfa00.js:626,2
  16. linux系统print命令,Linux系统命令大全
  17. eclipse python配置_Eclipse配置Python的IDE
  18. ant modal 修改样式 style
  19. js 检查当前浏览器是否在苹果设备上
  20. php+点击图片跳转网页,怎么在图片上加超链接 点击图片跳转到指定网页

热门文章

  1. mongodb 无法查出数据_mongodb查询不到数据
  2. TCP协议:三次握手过程
  3. pytorch卷积详解
  4. iOS-iPad强制竖屏
  5. TDChain受邀参加观火深圳大会 与区块链精英大咖同台论道
  6. 嵌入式C语言自我修养 04:Linux 内核第一宏:container_of
  7. 知客CRM携手湖南省粮油食品进出口集团有限公司
  8. 如何将JACOCO应用到企业实战中~测试过招,只需6点
  9. 数据中心clos网络容量设计(根据收敛比和端口)
  10. vivox23幻彩版手机怎么设置双击息屏