最后
权威指南-第一本Docker书
引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。
总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!
集合源码
说到集合,我们大家都非常熟悉,这可是我们工作中用得非常多的一类 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 之前,许多线程安全都是使用锁来实现的。而说到锁,我们就必须了解一下并发包源码。
并发包源码从零开始定义了一整套实现并发安全的机制,并且还提供了不少方便使用的并发工具。我们通过并发包就可以非常方便地实现多线程下的线程安全和并发控制,后面说到的阻塞队列都是以这个为基础的。
并发包是一整套接口和实现的定义,其主要的类和实现如下:
在并发源码最顶层的是 AbstractQueueSynchronizer 接口,其定义了并发控制最为基础的几个接口,之后的 Lock、ReentrantLock、ReentrantReadWriteLock 都是在这基础上实现的。而 Condition 接口则是继 AbstractQueueSynchronizer 接口之后的另一个重要接口,其定义了分支条件,使得并发适用于更复杂的业务。
定义好了 AbstractQueueSynchronizer 和 Condition 接口,并发包的基础就搭建好了。并发包中提供了 CountDownLatch、CyclicBarrier 等并发工具类来实现常用的并发操作,这些工具类都是使用前面提到的 Lock 来实现的。
阻塞队列源码
阻塞队列其实是属于并发包的一部分,但因为其功能性特别明显,所以我们专门挑出来单独说。阻塞队列用于在高并发环境下进行数据的交换,其实现基础是我们前面说到的并发包,没有并发包就没有阻塞队列。
在 JDK 中,阻塞队列一共可以分为三大类一共 8 个常用的阻塞队列。
基础实现
这块是阻塞队列最基础的实现
-
ArrayBlockingQueue:数组组成的有界阻塞队列
-
LinkedBlockingQueue:链表组成的无界阻塞队列
-
LinkedBlockingDeque:链表组成的双向阻塞队列
有序延迟实现
这块的阻塞队列还实现了元素的排序以及延迟功能,只有时间到了才能出队列。
-
PriorityBlockingQueue:支持优先级排序的无界阻塞队列
-
DelayQueue:支持优先级实现的无界延迟阻塞队列
-
DelayedWorkQueue:线程池中的延迟阻塞队列
数据交换实现
这块阻塞队列主要用于多线程之间的数据交换
-
SynchronousQueue:不存储元素的数据交换阻塞队列
-
LinkedTransferQueue:链表组成的数据交换无界阻塞队列
线程池源码
线程池也是 JDK 源码中非常重要的一块,妥善利用线程池可以提高效率。而线程池的基础其实就是我们前面讲到的阻塞队列,线程池的延迟功能都是使用阻塞队列实现的。线程池的整体架构比较多,但是并不复杂,也没有什么难点。如果弄懂了线程池的整体类结构,那么线程池也就没什么太大的问题了。
JVM原理
JVM 可以说是 Java 程序员必须要掌握的基础知识了。初学者或许会搞不懂这些东西到底有什么用,一开始学习都是为了面试用。但老司机告诉你学习 JVM 原理有下面两个非常重要的用处:
-
**理解 Java 语言特性。**Java 代码写出来的只是语言层面的东西,当我们要了解一个特性是如何实现的,我们就需要深入到字节码层面。例如:boolean 这个类型,在 Java 语言层面是存在的。但是其在字节码层面是不存在的,其在字节码层面是使用 Integer 的 1 和 0 表示 true 和 false。
-
**学习排查线上问题。**我们遇到线上 JVM 问题,经常提示说:
OutOfMemoryError: Java heap space
。这时候你会不知道从何入手,这是因为你不懂 JVM 的内存结构。所以你必须去学习 JVM 的内存结构,如何排查问题发生在哪块内存,如何解决问题。而这一切的基础就是 JVM 的基础知识。
框架源码
学习完 JDK 的源码,我们就需要把我们常用的框架源码都弄清楚。这样在遇到框架问题的时候,我们才可以快速地排查问题。
最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)
学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)
除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!
以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!