热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ConcurrentHashMap1.7和1.8设计思想

1.7中的ConcurrentHashMap的介绍HashMap是一个线程不安全的集合,如果想要在并发下让他线程安全那么可以使用Hashtable,但是

1.7中的ConcurrentHashMap的介绍

 

HashMap是一个线程不安全的集合,如果想要在并发下让他线程安全那么可以使用Hashtable,但是Hashtable是对整个集合进行加锁,这明显也不是我们想要的。按照历史经验来讲,要提升性能比较好想到的手段就是减小锁的粒度。

在ConcurrentHashMap1.7中使用了一组Segment集合作为作为锁,它的底层继承自ReentrantLock,Segment里面包含了一个HashEntry数组,HashEntry是一个链表结构的元素,每一个Segment分别锁定整个集合中的一部分数据,从而实现减小锁粒度提升并发能力的目的。

当发生并发更新的时候,首先求出key的hash值并定位到具体的segment,检查当前segment是否初始化,因为ConcurrentHashMap初始化时只会初始化第一个segment;之后对当前的segment尝试加锁,如果加锁失败将采用CAS进行自旋等待获取锁。

1.7中的ConcurrentHashMap是写锁而不是读写锁,所以在读数据的时候并没加锁,而是使用了volatile关键字修饰value,使其读的时候可以立马获取其他线程修改后的值。

在使用ConcurrentHashMap的时候,应该尽量避免使用size、containsValue因为最坏条件下ConcurrentHashMap可能会升级为全局锁。


1.8中的ConcurrentHashMap的介绍

 

1.7中的ConcurrentHashMap使用了分段锁的思想,要想实现更好的并发性就是继续减小索粒度。在1.8中的ConcurrentHashMap采用table数组元素作为锁,从而实现了更小的索粒度,进一步减少并发冲突概率。

这就让我感觉很多技术思想都是相通的,Hashtable,ConcurrentHashMap1.7到1.8很容易类比到MySQL的表锁,分段锁和行锁。都是尽可能的减小锁粒度从而提交并发性能。

1.7中的ConcurrentHashMap采用数组+单链表的数据结构对于一个hash表来说,最核心的能力就是将key hash之后能够均匀的分布,那么table数组中的每个队列长度主要为0或者1。但实际情况也并非如此理想,虽然ConcurrentHashMap类默认的加载因子是0.75,但是在数据量过大或者运气不佳的情况下,还是会存在一些队列长度过长的情况,如果还是采用单链表方式,那么某个节点的查询的时间复杂度就会退化成为O(n);因此对于超过8的列表,jdk1.8中采用了红黑树的结构,那么时间复杂度就可以降低到O(logN);


推荐阅读
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文深入探讨了如何选择适合业务需求的MySQL存储引擎,详细解析了不同存储引擎的特点、适用场景及其在数据存储和管理中的优势。通过对比InnoDB、MyISAM等主流引擎,为读者提供了全面的技术指导和专业建议,帮助开发者在实际应用中做出明智的选择。 ... [详细]
  • 河北省工业和信息化厅公文收发管理系统
    河北省工业和信息化厅及其下属各地市工信管理部门之间的文件传输主要依赖于纸质或电子邮件方式,这种方式存在效率低下、安全性差等问题。为了解决这些问题,省工信厅计划开发一套公文收发管理系统,实现文件的电子化和统一管理。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
  • 在2015年1月的MySQL内核报告中,我们详细探讨了性能优化和Group Commit机制的改进。尽管网上已有大量关于Group Commit的资料,本文将简要回顾其发展,并重点分析MySQL 5.6及之前版本中引入的二进制日志(Binlog)对性能的影响。此外,我们还将深入讨论最新的优化措施,如何通过改进Group Commit机制显著提升系统的整体性能和稳定性。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
author-avatar
馨海之洋_895
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有