JDK源码
JDK 源码是一切的基础,许多框架都参考了 JDK 源码的实现思路,因此弄懂 JDK 源码是一件非常重要的事情。而 JDK 源码又可以分为下面 4 大块:
- 集合源码
- 并发集合源码
- 并发包源码
- 阻塞队列源码
- 线程池源码
集合源码
说到集合,我们大家都非常熟悉,这可是我们工作中用得非常多的一类 API。但会用了,还得知道它到底是如何实现的,这样才可以避免踩坑。JDK 源码中的集合并不是特别多,大概有 四大类大概 14 个常用的 API。
List集合
- ArrayList:列表集合经典实现。
- Vector:列表集合经典实现,线程安全,与 ArrayList 对应。
- LinkedList:链表结构的经典实现。
- Stack:栈结构的经典实现,先进后出的数据结构。继承了 Vector,线程安全。
Set集合
- HashSet:Set 集合的哈希实现。
- LinkedHashSet:Set 集合的哈希实现,维护了元素插入顺序。
- TreeSet:Set 集合的有序实现。
Queue集合
- PriorityQueue:优先级队列
- LinkedList:双向队列实现
- ArrayDeque:双向循环队列实现
Map集合
- HashMap:Map 集合的经典哈希实现。
- LinkedHashMap:在 HashMap 的基础上,增加了对插入元素的链表维护。
- WeakedHashMap:在 HashMap 的基础上,使强引用变为弱引用。
- TreeMap:Map 集合的有序实现。底层是红黑树的经典实现。
在这 14 个常用的 API 中虽然有一些我们还没使用过,但如果你要建立起一套完整的知识体系,那么还是有必要去仔细琢磨一下它们的作用,并且对它们进行横向比较的。
并发集合源码
我们前面说到的集合源码,它们大部分都是线程不安全的,它们在多线程的环境下使用会产生各种各样的问题。而线程安全与并发安全又不一样,线程安全考虑的是绝对的安全,而并发安全则是牺牲部分特性来提高并发效率。也就是说并发集合适合在多线程环境下使用,并且效率足够高,能够应对高并发的情况。
在 JDK 的并发集合源码中,一共有 7 个常用的并发集合。
- ConcurrentHashMap:高并发的HashMap
- ConcurrentSkipListMap:高并发下的TreeMap(基于跳表实现)
- ConcurrentSkipListSet:内部使用ConcurrentSkipListMap实现
- CopyOnWriteArrayList:高并发的ArrayList,适合读场景。
- CopyOnWriteArraySet:高并发的Set集合,使用CopyOnWriteArrayList实现。
- ConcurrentLinkedQueue:高并发的链表队列。
- ConcurrentLinkedDeque:高并发的双向链表队列。
虽然有 7 个并发集合,但是实际上只有 5 个左右,因为另外两个都直接用代理的方式委托实现。例如:CopyOnWriteArraySet 类内部并没有具体的逻辑实现,而是直接委托 CopyOnWriteArrayList 实现。
并发包源码
我们前面说过许多集合都是线程不安全的,在多线程环境、甚至高并发环境需要使用并发集合。那么并发集合到底是怎么实现线程安全的呢?在 JDK1.8 之后,并发集合大部分都使用 CAS 来实现线程安全。而其实在 JDK1.8 之前,许多线程安全都是使用锁来实现的。而说到锁,我们就必须了解一下并发包源码。
并发包源码从零开始定义了一整套实现并发安全的机制,并且还提供了不少方便使用的并发工具。我们通过并发包就可以非常方便地实现多线程下的线程安全和并发控制,后面说到的阻塞队列都是以这个为基础的。
|