声明,本文用的是jdk1.8html
前面章节回顾:java
本篇主要讲解ConCurrentHashMap~面试
看这篇文章以前最好是有点数据结构的基础:算法
固然了,若是讲得有错的地方还请你们多多包涵并不吝在评论去指正~c#
ConCurrentHashMap在初学的时候反正我是没有接触过的,不知道大家接触过了没有~数组
这个类听得也挺少的,在集合中是比较复杂的一个类了,它涉及到了一些多线程的知识点。安全
不了解或忘记多线程知识点的同窗也不要怕,哪儿用到了多线程的知识点,我都会简单介绍一下,并给出对应的资料去阅读的~微信
好了,咱们就来开始吧~数据结构
ConCurrentHashMap的底层是:散列表+红黑树,与HashMap是同样的。多线程
从前面的章节咱们也能够发现:最快了解一下类是干吗的,咱们看源码的顶部注释就能够了!
我简单翻译了一下顶部的注释(我英文水平渣,若是有错的地方请多多包涵~欢迎在评论区下指正)
根据上面注释咱们能够简单总结:
上面指明的是JDK1.8底层是:散列表+红黑树,也就意味着,JDK1.7的底层跟JDK1.8是不一样的~
JDK1.7的底层是:segments+HashEntry数组:
图来源:https://blog.csdn.net/panweiwei1994/article/details/78897275
大概了解一下便可~
在看ConCurrentHashMap源码以前,咱们来简单讲讲CAS算法和volatile关键字
CAS(比较与交换,Compare and swap) 是一种有名的无锁算法
CAS有3个操做数
当且仅当预期值A和内存值V相同时,将内存值V修改成B,不然什么都不作
看了上面的描述应该就很容易理解了,先比较是否相等,若是相等则替换(CAS算法)
接下来咱们看看volatile关键字,在初学的时候也不多使用到volatile这个关键字。反正我没用到,而又常常在看Java相关面试题的时候看到它,以为是一个挺神秘又很难的一个关键字。其实否则,仍是挺容易理解的~
volatile经典总结:volatile仅仅用来保证该变量对全部线程的可见性,但不保证原子性
咱们将其拆开来解释一下:
若是没看懂或者想要深刻了解其原理和可参考下列博文:
域对象有这么几个:
咱们来简单看一下他们是什么东东:
初次阅读完以后,有的属性我也不太清楚它是干什么的,在继续阅读以后可能就明朗了~
ConcurrentHashMap的构造方法有5个:
具体的实现是这样子的:
能够发现,在构造方法中有几处都调用了tableSizeFor()
,咱们来看一下他是干什么的:
点进去以后发现,啊,原来我看过这个方法,在HashMap的时候.....
它就是用来获取大于参数且最接近2的整次幂的数...
赋值给sizeCtl属性也就说明了:这是下次扩容的大小~
终于来到了最核心的方法之一:put方法啦~~~~
咱们先来总体看一下put方法干了什么事:
接下来,咱们来看看初始化散列表的时候干了什么事:initTable()
从顶部注释咱们能够读到,get方法是不用加锁的,是非阻塞的。
咱们能够发现,Node节点是重写的,设置了volatile关键字修饰,导致它每次获取的都是最新设置的值
上面简单介绍了ConcurrentHashMap的核心知识,还有不少知识点都没有说起到,做者的水平也不能将其弄懂~~有兴趣进入的同窗可到下面的连接继续学习。
下面我来简单总结一下ConcurrentHashMap的核心要点:
参考资料:
明天要是无心外的话,可能会写Set集合,敬请期待哦~~~~
文章的目录导航:https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同窗,能够关注微信公众号:Java3y。为了你们方便,刚新建了一下qq群:742919422,你们也能够去交流交流。谢谢支持了!但愿能多介绍给其余有须要的朋友