Java容器源码
文章平均质量分 88
George&Rita
星光不负赶路人!
展开
-
深入理解ConcurrentHashMap1.8源码
之前介绍了ConcurrentHashMap1.7,采用的是数组+分段锁的方式来实现的。虽然说采用分段锁的方式能够在一定程度上提高并发的效率,但是锁的粒度是Segment级别的,其实还是挺大的。于是,ConcurrentHashMap1.8继续在1.7版本上进行改进,将锁的粒度进一步减小,变成Node级别,又提升了并发的效率。原创 2022-12-31 15:56:38 · 1003 阅读 · 1 评论 -
深入理解ConcurrentHashMap1.7源码
ConcurrentHashMap1.7的设计思想还是很精妙的,值得我们学习。它将所有的HashEntry分配到多个Segment上,当进行put,remove等修改操作的时候,不需要锁整个ConcurrentHashMap,只需要锁修改的HashEntry所在的段,一定程度上提高了并发的效率。对于ConcurrentHashMap1.7的扩容,只能对Segment内的HashEntry数组进行扩容,不能增加Segment的个数。ConcurrentHashMap1.7 最最最最最详细源码分析。原创 2022-12-31 10:17:35 · 1047 阅读 · 0 评论 -
深入理解ConcurrentLinkedQueue源码
ConcurrentLinkedQueue的设计方式采用的是延迟更新头指针和尾指针。通常我们为了保证同步,在入队和出队的时候需要加入synchronized或者锁,但是这种方式是消耗很大的。而Doug Lea大师使用CAS的方式轻松化解线程不安全问题。其实他也可以通过自旋的方式来做到实时更新头指针和尾指针,但是这会带来一定的消耗。延迟更新的设计方式则可以大大减少CAS的次数,提升效率。并发容器之ConcurrentLinkedQueue。原创 2022-12-30 23:03:53 · 735 阅读 · 0 评论 -
Java重点源码回顾——HashMap1.8
在之前的文章中,我们介绍了HashMap1.7的源码,今天我们来看下HashMap1.8的源码。HashMap1.8相比于1.7最大的改变就是改变了1.7中采用数组+链表的方式存储键值对,转而由数组+链表+红黑树的方式来存储键值对。HashMap1.8的底层结构如下图所示:当链表中结点数较少(小于8)的时候,还是采用数组+链表的方式。当链表中结点过多,就会造成查找效率低下的情况,就会转而采用数组+红黑树的方式。原创 2022-12-30 20:45:43 · 1053 阅读 · 0 评论 -
Java重点源码回顾——HashMap1.7
HashMap在我们的日常使用中非常多,所以今天来阅读下它的源码,了解它具体的设计思想,能够帮助我们扩宽视野。HashMap两个主要的版本是1.7和1.8,都是线程不安全的。1.8版本是在1.7版本的基础上引入了红黑树等优化,提升整体的效率。今天我们先来简单了解下HashMap1.7版本的源码。它的主要特点总结如下:在HashMap1.7中,并没有引入红黑树。所以采用的方式还是拉链法。因为HashMap1.7是采用拉链法存储数据的,所以需要将key-value键值对封装成一个节点类,如下所示:从代码上原创 2022-12-30 16:44:51 · 886 阅读 · 0 评论 -
Java容器源码重点回顾——LinkedList
.LinkedList是。LinkedList的底层数据结构是链表,。因为LinkedList实现了Deque接口,这也是使它具有双端队列的特性。此外,原创 2022-12-17 16:10:44 · 598 阅读 · 0 评论 -
Java容器源码重点回顾——CopyOnWriteArrayList
CopyOnWriteArrayList就是针对了读写场景下互斥的缺陷,进行优化。它在每次需要进行修改的时候,先拷贝一份原来的数组,在拷贝的新数组上进行修改,最后再将引用指向新数组。这样就能保证,有线程在修改时,读线程不会被阻塞。提高了读写的性能。原创 2022-12-16 17:24:55 · 433 阅读 · 0 评论 -
Java容器源码重点回顾——Vector
Vector是一个古老的类,现在很少使用了,基于数组实现的,是一个动态数组,数组容量是可以自动增长的。(注意:Vector只能保证单个方法的线程安全,组合方法是没法保证线程安全,具体可见)因为Vector和ArrayList的代码极为相似,建议没有看过ArrayList源码的同学可以先看下。看完ArrayList源码再看Vector就会很轻松。原创 2022-12-15 17:41:00 · 655 阅读 · 0 评论 -
Java容器源码重点回顾——ArrayList
ArrayList本质上是一个动态数组,是基于数组实现的,其容量是能自动增长。但是ArrayList是线程不安全的。..原创 2022-12-14 21:40:20 · 299 阅读 · 0 评论