`

java深入学习ConcurrentHashmap (JDK8)

jdk 
阅读更多
原博文:http://blog.csdn.net/u010723709/article/details/48007881

看了一些博文,总结下(JDK8源码):
1、ConcurrentHashmap  使用的是位桶+链表/红黑树实现,结构与hashmap一样,它摒弃了以前Segment(锁段)的概念,而用了一种新的方式实现,CAS算法实现,并且为了实现并发,加入了如treeBin等辅助类;treeBin并不负责包装用户的key、value信息,而是包装的很多TreeNode节点。它代替了TreeNode的根节点,也就是说在实际的ConcurrentHashMap“数组”中,存放的是TreeBin对象

2、Node节点类中与hashmap不一样的是,在对value和next属性设置了volatile同步锁,不允许调用setValue方法直接改变Node的value域,但增加了find方法。

3、一个重要的属性sizeCtrl用来表示扩容的情况的标识,正数或0代表hash表还没有被初始化,这个数值表示初始化或下一次进行扩容的大小;-1代表正在初始化;-N 表示有N-1个线程正在进行扩容操作。

4、put操作
第一步:初始化,对于ConcurrentHashMap来说,调用它的构造方法仅仅是设置了一些参数而已。而整个table的初始化是在向ConcurrentHashMap中插入元素的时候发生的。如调用put、computeIfAbsent、compute、merge等方法的时候。
第二步:在存入值前,key值hash化,遍历位桶数组,如果发现需要扩容,则首先扩容。构建一个2倍中间的nexttable表,在需要复制的地方,先将一个null节点设置为ForwardingNode,然后加锁,复制内容;其他线程遍历到这个节点时,就会跳过往下一个节点继续遍历,直到复制玩内容,sizeCtrl变成扩容后的0.75n
第三步:如果当前hash没被占用,会被直接存储。如果hash有冲突,若当前节点下为链表,则会依次比对,hash和key都相同,则替换value值;没有就将当前值插入到链表最后,当发现链表长多超过8时,会转成红黑树,但在位桶中存的是TreeBin,TreeBin存放的是TreeNode。如果有冲突且节点下为treeBin时,则按照红黑树查找,存放到相应位置。

5、get操作,get方法比较简单,给定一个key来确定value的时候,必须满足两个条件  key相同  hash值相同,对于节点可能在链表或树上的情况,需要分别去查找。

6、size对于ConcurrentHashMap来说,这个table里到底装了多少东西其实是个不确定的数量,因为不可能在调用size()方法的时候像GC的“stop the world”一样让其他线程都停下来让你去统计,因此只能说这个数量是个估计值,主要运用了mappingCount
分享到:
评论

相关推荐

    最新版javajdk8文档

    以上这些特性都是Java 8的重要更新,通过深入学习和熟练应用,开发者可以编写出更加高效、简洁的Java代码。文档中会详细解释每个特性的用法、示例以及背后的原理,是Java开发者不可或缺的参考资料。

    旧版本JDK JDK1.4

    **Java Development Kit (JDK) 1.4:历史、特性与重要性** JDK(Java Development Kit)是Oracle公司发布的用于...尽管现在可能很少有人直接使用这个版本,但了解其特性对于深入学习Java技术和历史背景是很有价值的。

    [JAVA教程] 张老师JDK8实战视频教程 51集JDK8专业标准学习课程 全新JDK新特性与实战教学.rar

    【JAVA教程】张老师的JDK8实战视频教程涵盖了51集的专业标准学习内容,全面解析了JDK8的新特性和实战应用。这个课程是专为Java开发者设计的,旨在帮助他们掌握最新的JDK版本,提升编程技能。在这个教程中,我们将...

    JDK8 中文帮助文档(jdk api 1.8 google.CHM)

    **JDK8中文帮助文档详解** JDK8(Java Development Kit 8)是Java编程语言的一个重要版本,它带来了许多重大的...通过深入理解和熟练运用这些知识点,开发者能够更好地利用JDK8的功能,编写出高效、简洁的Java代码。

    jdk1.8中文版

    **Java Development Kit (JDK) 1.8 中文版** JDK 1.8,全称为Java Development Kit 1.8,是Oracle公司推出的Java编程语言的一个重要版本。这个版本引入了许多创新特性,旨在提高开发人员的生产力,优化应用程序性能...

    java jdk1.8正版英文文档

    8. ** Nashorn JavaScript引擎**:JDK 1.8引入了一个新的JavaScript引擎,名为Nashorn,允许Java程序直接执行JavaScript代码,提供了JavaScript和Java之间的互操作性。 9. **并发改进**:包括Fork/Join框架的改进,...

    Java JDK 8学习笔记

    Java JDK 8是Java开发工具包的一个重大更新,它引入了一系列新特性,旨在提升开发者效率,简化编程模型,并增强性能。...《Java JDK 8学习笔记》这本书可能会详细讲解这些内容,并提供实例来帮助读者深入理解。

    Java jdk1.7学习笔记pdf

    ### Java JDK 1.7 学习笔记核心知识点解析 ...通过本书的学习,不仅可以掌握Java的基本语法和核心概念,还能深入了解JDK 1.7中的一些高级特性,这对于提升编程技能和个人职业发展都有着重要的意义。

    java_API JDK1.7

    这个Java_api压缩包文件包含了JDK 1.7的API文档,详细解释了每个类、接口、方法和常量的用法,是开发者学习和查阅Java API的重要参考资料。通过阅读和理解这些文档,开发者可以更深入地掌握Java编程,并利用其新特性...

    JAVA学习JDK-Api 1.6中文版

    Java是世界上最流行的...总的来说,对于想要深入学习和使用Java 1.6的开发者来说,这个中文版的API文档是一个非常宝贵的资源,它将加速学习过程,提高开发效率,让开发者能够更好地利用Java 1.6提供的各种功能和特性。

    Java中文手册jdk1.6

    8. **改进的调试工具**:Java Development Kit (JDK)的内置调试工具JDB和VisualVM有了显著的改进,为开发者提供了更强大的调试能力。 9. **Java插件和Web启动**:Java Web Start技术得到了优化,提升了用户体验,...

    Java JDK 6学习笔记_pdf版(附课本代码)

    这份“Java JDK 6学习笔记”涵盖了从基础到高级的各种主题,是Java初学者和进阶者的重要参考资料。以下是笔记中可能包含的一些关键知识点: 1. **安装与配置**:介绍如何在不同操作系统(如Windows、Linux和Mac OS...

    JDK_API_1_6_zh_CN.zip_api1_java api1.6_jdk api 1.6_jdk api1_jdk

    《JDK API 1.6:Java开发的关键指南》 在Java编程的世界中,JDK(Java Development Kit)是开发者的重要...对于Java开发者而言,深入理解和掌握JDK API 1.6的知识点,是提升编程技能、提高开发效率不可或缺的一步。

    [Java参考文档].JDK_API_1_6_zh_CN.CHM百度网盘下载地址

    对于希望深入学习 Java 的开发者来说,JDK 1.6 的 API 文档是一个宝贵的资源。通过对文档的学习,开发者不仅能够了解 Java 语言的基本语法,还能掌握各种高级特性和最佳实践。此外,结合实际编程项目进行实践也是...

    Java JDK6学习笔记[ppt]

    Java JDK6学习笔记是针对Java开发初学者及进阶者的重要参考资料,主要涵盖了JDK6版本中的关键特性和编程实践。...通过深入学习和反复实践,你将在Java世界中游刃有余,逐步成长为一名优秀的Java开发者。

    jdk-8u261-docs-all.zip

    《JDK8官方文档详解——深入理解Java开发关键要素》 JDK(Java Development Kit)是Java编程语言的核心工具集,包含了编译器、运行时环境以及一系列的API。JDK8是Java历史上的一个重要版本,引入了许多创新特性,极...

    jdk学习笔记

    **Java JDK学习笔记** 在Java开发领域,JDK(Java Development Kit)是不可或缺的基础工具,它包含了Java...通过深入学习和实践,我们可以不断提升自己的编程能力和问题解决能力,为Java开发生涯打下坚实的基础。

    jdk8源码.zip

    这份"jdk8源码.zip"压缩包提供的是JDK 8的源代码,对于那些想要深入理解Java平台工作原理、优化代码或进行二次开发的程序员来说,这是一个宝贵的资源。 在JDK 8中,以下是一些关键的知识点: 1. **Lambda表达式**...

    JDK1.7_API帮助文档.chm

    8. **改进的并发工具**:`ConcurrentHashMap`性能提升,新增`ForkJoinPool`和`ForkJoinTask`用于并行计算。 9. **新的集合工厂方法**:如`Map.of()`和`List.of()`,简化了创建不可变集合的代码。 10. **改进的...

    Java+JDK+7 Learning notes.zip_java_jdk

    总之,Java JDK 7学习笔记涵盖了Java编程的基础到高级主题,通过深入学习,不仅可以掌握Java编程的基本技能,还能了解JDK 7的新特性,为成为合格的Java开发者打下坚实的基础。在实际开发过程中,结合这些知识,可以...

Global site tag (gtag.js) - Google Analytics