原博文: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
分享到:
相关推荐
以上这些特性都是Java 8的重要更新,通过深入学习和熟练应用,开发者可以编写出更加高效、简洁的Java代码。文档中会详细解释每个特性的用法、示例以及背后的原理,是Java开发者不可或缺的参考资料。
**Java Development Kit (JDK) 1.4:历史、特性与重要性** JDK(Java Development Kit)是Oracle公司发布的用于...尽管现在可能很少有人直接使用这个版本,但了解其特性对于深入学习Java技术和历史背景是很有价值的。
【JAVA教程】张老师的JDK8实战视频教程涵盖了51集的专业标准学习内容,全面解析了JDK8的新特性和实战应用。这个课程是专为Java开发者设计的,旨在帮助他们掌握最新的JDK版本,提升编程技能。在这个教程中,我们将...
**JDK8中文帮助文档详解** JDK8(Java Development Kit 8)是Java编程语言的一个重要版本,它带来了许多重大的...通过深入理解和熟练运用这些知识点,开发者能够更好地利用JDK8的功能,编写出高效、简洁的Java代码。
**Java Development Kit (JDK) 1.8 中文版** JDK 1.8,全称为Java Development Kit 1.8,是Oracle公司推出的Java编程语言的一个重要版本。这个版本引入了许多创新特性,旨在提高开发人员的生产力,优化应用程序性能...
8. ** Nashorn JavaScript引擎**:JDK 1.8引入了一个新的JavaScript引擎,名为Nashorn,允许Java程序直接执行JavaScript代码,提供了JavaScript和Java之间的互操作性。 9. **并发改进**:包括Fork/Join框架的改进,...
Java JDK 8是Java开发工具包的一个重大更新,它引入了一系列新特性,旨在提升开发者效率,简化编程模型,并增强性能。...《Java JDK 8学习笔记》这本书可能会详细讲解这些内容,并提供实例来帮助读者深入理解。
### Java JDK 1.7 学习笔记核心知识点解析 ...通过本书的学习,不仅可以掌握Java的基本语法和核心概念,还能深入了解JDK 1.7中的一些高级特性,这对于提升编程技能和个人职业发展都有着重要的意义。
这个Java_api压缩包文件包含了JDK 1.7的API文档,详细解释了每个类、接口、方法和常量的用法,是开发者学习和查阅Java API的重要参考资料。通过阅读和理解这些文档,开发者可以更深入地掌握Java编程,并利用其新特性...
Java是世界上最流行的...总的来说,对于想要深入学习和使用Java 1.6的开发者来说,这个中文版的API文档是一个非常宝贵的资源,它将加速学习过程,提高开发效率,让开发者能够更好地利用Java 1.6提供的各种功能和特性。
8. **改进的调试工具**:Java Development Kit (JDK)的内置调试工具JDB和VisualVM有了显著的改进,为开发者提供了更强大的调试能力。 9. **Java插件和Web启动**:Java Web Start技术得到了优化,提升了用户体验,...
这份“Java JDK 6学习笔记”涵盖了从基础到高级的各种主题,是Java初学者和进阶者的重要参考资料。以下是笔记中可能包含的一些关键知识点: 1. **安装与配置**:介绍如何在不同操作系统(如Windows、Linux和Mac OS...
《JDK API 1.6:Java开发的关键指南》 在Java编程的世界中,JDK(Java Development Kit)是开发者的重要...对于Java开发者而言,深入理解和掌握JDK API 1.6的知识点,是提升编程技能、提高开发效率不可或缺的一步。
对于希望深入学习 Java 的开发者来说,JDK 1.6 的 API 文档是一个宝贵的资源。通过对文档的学习,开发者不仅能够了解 Java 语言的基本语法,还能掌握各种高级特性和最佳实践。此外,结合实际编程项目进行实践也是...
Java JDK6学习笔记是针对Java开发初学者及进阶者的重要参考资料,主要涵盖了JDK6版本中的关键特性和编程实践。...通过深入学习和反复实践,你将在Java世界中游刃有余,逐步成长为一名优秀的Java开发者。
《JDK8官方文档详解——深入理解Java开发关键要素》 JDK(Java Development Kit)是Java编程语言的核心工具集,包含了编译器、运行时环境以及一系列的API。JDK8是Java历史上的一个重要版本,引入了许多创新特性,极...
**Java JDK学习笔记** 在Java开发领域,JDK(Java Development Kit)是不可或缺的基础工具,它包含了Java...通过深入学习和实践,我们可以不断提升自己的编程能力和问题解决能力,为Java开发生涯打下坚实的基础。
这份"jdk8源码.zip"压缩包提供的是JDK 8的源代码,对于那些想要深入理解Java平台工作原理、优化代码或进行二次开发的程序员来说,这是一个宝贵的资源。 在JDK 8中,以下是一些关键的知识点: 1. **Lambda表达式**...
8. **改进的并发工具**:`ConcurrentHashMap`性能提升,新增`ForkJoinPool`和`ForkJoinTask`用于并行计算。 9. **新的集合工厂方法**:如`Map.of()`和`List.of()`,简化了创建不可变集合的代码。 10. **改进的...
总之,Java JDK 7学习笔记涵盖了Java编程的基础到高级主题,通过深入学习,不仅可以掌握Java编程的基本技能,还能了解JDK 7的新特性,为成为合格的Java开发者打下坚实的基础。在实际开发过程中,结合这些知识,可以...