搞Java的年薪40W是什么水平?( 二 )


CopyOnWriteArrayList:高并发的ArrayList 。适合读场景 。
CopyOnWriteArraySet:高并发的Set集合 。使用CopyOnWriteArrayList实现 。
ConcurrentLinkedQueue:高并发的链表队列 。
ConcurrentLinkedDeque:高并发的双向链表队列 。
虽然有 7 个并发集合 。但是实际上只有 5 个左右 。因为另外两个都直接用代理的方式委托实现 。例如:CopyOnWriteArraySet 类内部并没有具体的逻辑实现 。而是直接委托 CopyOnWriteArrayList 实现 。
3、并发包源码
我们前面说过许多集合都是线程不安全的 。在多线程环境、甚至高并发环境需要使用并发集合 。那么并发集合到底是怎么实现线程安全的呢?在 JDK1.8 之后 。并发集合大部分都使用 CAS 来实现线程安全 。而其实在 JDK1.8 之前 。许多线程安全都是使用锁来实现的 。而说到锁 。我们就必须了解一下并发包源码 。
并发包源码从零开始定义了一整套实现并发安全的机制 。并且还提供了不少方便使用的并发工具 。我们通过并发包就可以非常方便地实现多线程下的线程安全和并发控制 。后面说到的阻塞队列都是以这个为基础的 。
并发包是一整套接口和实现的定义 。其主要的类和实现如下:

搞Java的年薪40W是什么水平?

文章插图
在并发源码最顶层的是 AbstractQueueSynchronizer 接口 。其定义了并发控制最为基础的几个接口 。之后的 Lock、ReentrantLock、ReentrantReadWriteLock 都是在这基础上实现的 。而 Condition 接口则是继 AbstractQueueSynchronizer 接口之后的另一个重要接口 。其定义了分支条件 。使得并发适用于更复杂的业务 。
定义好了 AbstractQueueSynchronizer 和 Condition 接口 。并发包的基础就搭建好了 。并发包中提供了 CountDownLatch、CyclicBarrier 等并发工具类来实现常用的并发操作 。这些工具类都是使用前面提到的 Lock 来实现的 。
4、阻塞队列源码
阻塞队列其实是属于并发包的一部分 。但因为其功能性特别明显 。所以我们专门挑出来单独说 。阻塞队列用于在高并发环境下进行数据的交换 。其实现基础是我们前面说到的并发包 。没有并发包就没有阻塞队列 。
在 JDK 中 。阻塞队列一共可以分为三大类一共 8 个常用的阻塞队列 。
①. 基础实现:
这块是阻塞队列最基础的实现
ArrayBlockingQueue:数组组成的有界阻塞队列
LinkedBlockingQueue:链表组成的无界阻塞队列
LinkedBlockingDeque:链表组成的双向阻塞队列
②. 有序延迟实现:
这块的阻塞队列还实现了元素的排序以及延迟功能 。只有时间到了才能出队列 。
PriorityBlockingQueue:支持优先级排序的无界阻塞队列
DelayQueue:支持优先级实现的无界延迟阻塞队列
DelayedWorkQueue:线程池中的延迟阻塞队列
③. 数据交换实现:
这块阻塞队列主要用于多线程之间的数据交换
SynchronousQueue:不存储元素的数据交换阻塞队列
LinkedTransferQueue:链表组成的数据交换无界阻塞队列
搞Java的年薪40W是什么水平?

文章插图
5、线程池源码
线程池也是 JDK 源码中非常重要的一块 。妥善利用线程池可以提高效率 。而线程池的基础其实就是我们前面讲到的阻塞队列 。线程池的延迟功能都是使用阻塞队列实现的 。线程池的整体架构比较多 。但是并不复杂 。也没有什么难点 。如果弄懂了线程池的整体类结构 。那么线程池也就没什么太大的问题了 。
搞Java的年薪40W是什么水平?

文章插图
JVM 可以说是 Java 程序员必须要掌握的基础知识了 。初学者或许会搞不懂这些东西到底有什么用 。一开始学习都是为了面试用 。但老司机告诉你学习 JVM 原理有下面两个非常重要的用处:
理解 Java 语言特性 。Java 代码写出来的只是语言层面的东西 。当我们要了解一个特性是如何实现的 。我们就需要深入到字节码层面 。例如:boolean 这个类型 。在 Java 语言层面是存在的 。但是其在字节码层面是不存在的 。其在字节码层面是使用 Integer 的 1 和 0 表示 true 和 false 。
学习排查线上问题 。我们遇到线上 JVM 问题 。经常提示说: 。这时候你会不知道从何入手 。这是因为你不懂 JVM 的内存结构 。所以你必须去学习 JVM 的内存结构 。如何排查问题发生在哪块内存 。如何解决问题 。而这一切的基础就是 JVM 的基础知识 。
关于 JVM 的基础知识 。我会写了一个系列的文章来介绍 。有兴趣的关注我阅读以下

推荐阅读