当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、ConCurrentHashMap剖析ConCurrentHashMap在初学的时候反正我是没有接触过的,不知道你们接触过了没有~ 这个类听得也挺少的,在集合中是比较复杂的一个类了,它涉及到了一些多线程的知识点。 不了解或忘记多线程知识点的同学也不要怕,哪儿用到了多线程的知识点,我都会简单介绍一下,并给出对应的资料去阅读的~ 好了,我们就来开始吧~ 1.1初识ConCurrentHashMapConCurrentHashMap的底层是:散列表+红黑树,与HashMap是一样的。 从前面的章节我们也可以发现:最快了解一下类是干嘛的,我们看源码的顶部注释就可以了! 我简单翻译了一下顶部的注释(我英文水平渣,如果有错的地方请多多包涵~欢迎在评论区下指正) 根据上面注释我们可以简单总结:
1.2JDK1.7底层实现上面指明的是JDK1.8底层是:散列表+红黑树,也就意味着,JDK1.7的底层跟JDK1.8是不同的~ JDK1.7的底层是:segments+HashEntry数组: 图来源:https://blog.csdn.net/panweiwei1994/article/details/78897275
大概了解一下即可~ 1.3有了Hashtable为啥需要ConCurrentHashMap
1.4CAS算法和volatile简单介绍在看ConCurrentHashMap源码之前,我们来简单讲讲CAS算法和volatile关键字 CAS(比较与交换,Compare and swap) 是一种有名的无锁算法 CAS有3个操作数
当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做
看了上面的描述应该就很容易理解了,先比较是否相等,如果相等则替换(CAS算法) 接下来我们看看volatile关键字,在初学的时候也很少使用到volatile这个关键字。反正我没用到,而又经常在看Java相关面试题的时候看到它,觉得是一个挺神秘又很难的一个关键字。其实不然,还是挺容易理解的~ volatile经典总结:volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性 我们将其拆开来解释一下:
如果没看懂或者想要深入了解其原理和可参考下列博文:
1.5ConCurrentHashMap域域对象有这么几个: 我们来简单看一下他们是什么东东: 初次阅读完之后,有的属性我也不太清楚它是干什么的,在继续阅读之后可能就明朗了~ 1.6ConCurrentHashMap构造方法ConcurrentHashMap的构造方法有5个: 具体的实现是这样子的: 可以发现,在构造方法中有几处都调用了 点进去之后发现,啊,原来我看过这个方法,在HashMap的时候….. 它就是用来获取大于参数且最接近2的整次幂的数… 赋值给sizeCtl属性也就说明了:这是下次扩容的大小~ 1.7put方法终于来到了最核心的方法之一:put方法啦~~~~ 我们先来整体看一下put方法干了什么事: 接下来,我们来看看初始化散列表的时候干了什么事:
1.8get方法从顶部注释我们可以读到,get方法是不用加锁的,是非阻塞的。 我们可以发现,Node节点是重写的,设置了volatile关键字修饰,致使它每次获取的都是最新设置的值 二、总结上面简单介绍了ConcurrentHashMap的核心知识,还有很多知识点都没有提及到,作者的水平也不能将其弄懂~~有兴趣进入的同学可到下面的链接继续学习。 下面我来简单总结一下ConcurrentHashMap的核心要点:
参考资料:
|
|