随笔分类 -  JDK 源码分析

1
摘要:概述 Semaphore 是并发包中的一个工具类,可理解为信号量。通常可以作为限流器使用,即限制访问某个资源的线程个数,比如用于限制连接池的连接数。 打个通俗的比方,可以把 Semaphore 理解为一辆公交车:车上的座位数(初始的“许可” permits 数量)是固定的,行驶期间如果有人上车(获取 阅读全文
posted @ 2019-08-10 11:49 WriteOnRead 阅读(336) 评论(0) 推荐(0)
摘要:概述 CyclicBarrier 是并发包中的一个工具类,它的典型应用场景为:几个线程执行完任务后,执行另一个线程(回调函数,可选),然后继续下一轮,如此往复。 打个通俗的比方,可以把 CyclicBarrier 的执行流程比作:几个人(类比线程)围着操场跑圈,所有人都到达终点后(终点可理解为“屏障 阅读全文
posted @ 2019-08-08 20:44 WriteOnRead 阅读(364) 评论(0) 推荐(0)
摘要:概述 CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行。 简单起见,可以把它理解为一个倒数的计数器:初始值为线程数,每个线程结束时执行减 1 操作,当计数器减到 0 时等待的线程再继续执行。 代码分析 Count 阅读全文
posted @ 2019-08-07 21:21 WriteOnRead 阅读(437) 评论(0) 推荐(0)
摘要:概述 在 JDK 1.5 以前,锁的实现只能用 synchronized 关键字;1.5 开始提供了 ReentrantLock,它是 API 层面的锁。先看下 ReentrantLock 的类签名以及如何使用: 典型用法: 该用法和使用 synchronized 关键字效果是一样的。既然有了 sy 阅读全文
posted @ 2019-08-06 21:33 WriteOnRead 阅读(460) 评论(0) 推荐(0)
摘要:概述 前文「JDK源码分析-AbstractQueuedSynchronizer(2)」分析了 AQS 在独占模式下获取资源的流程,本文分析共享模式下的相关操作。 其实二者的操作大部分是类似的,理解了前面对独占模式的分析,再分析共享模式就相对容易了。 共享模式 方法概述 与独占模式类似,共享模式下也 阅读全文
posted @ 2019-08-05 22:15 WriteOnRead 阅读(440) 评论(0) 推荐(0)
摘要:概述 前文「JDK源码分析-AbstractQueuedSynchronizer(1)」初步分析了 AQS,其中提到了 Node 节点的「独占模式」和「共享模式」,其实 AQS 也主要是围绕对这两种模式的操作进行的。 Node 节点是对线程 Thread 类的封装,因此两种模式可以理解如下: 独占模 阅读全文
posted @ 2019-08-04 22:23 WriteOnRead 阅读(388) 评论(0) 推荐(0)
摘要:概述 前文「JDK源码分析-Lock&Condition」简要分析了 Lock 接口,它在 JDK 中的实现类主要是 ReentrantLock (可译为“重入锁”)。ReentrantLock 的实现主要依赖于其内部的一个嵌套类 Sync,而 Sync 又继承自 AbstractQueuedSyn 阅读全文
posted @ 2019-08-04 11:27 WriteOnRead 阅读(334) 评论(0) 推荐(0)
摘要:前文「JDK源码分析-HashMap(1)」分析了 HashMap 的内部结构和主要方法的实现原理。但是,面试中通常还会问到很多其他的问题,本文简要分析下常见的一些问题。 这里再贴一下 HashMap 内部的结构图(JDK 1.8): FAQ Q1: HashMap 是否线程安全?为什么? 首先 H 阅读全文
posted @ 2019-08-01 00:31 WriteOnRead 阅读(162) 评论(0) 推荐(0)
摘要:概述 前文「JDK源码分析-HashMap(1)」分析了 HashMap 主要方法的实现原理(其他问题以后分析),本文分析下 LinkedHashMap。 先看一下 LinkedHashMap 的类继承结构图: 可以看到 LinkedHashMap 继承了 HashMap。 我们知道 HashMap 阅读全文
posted @ 2019-08-01 00:21 WriteOnRead 阅读(295) 评论(0) 推荐(0)
摘要:概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客。它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是“链表法”,并且在 JDK 1.8 做了优化,当链表长度达到一定数量时会把链表转为红黑树。 因此,JDK 1.8 中的 HashMap 实现可 阅读全文
posted @ 2019-07-02 00:32 WriteOnRead 阅读(264) 评论(0) 推荐(0)
摘要:前文「JDK源码分析-TreeMap(1)」分析了 TreeMap 的一些方法,本文分析其中的增删方法。这也是红黑树插入和删除节点的操作,由于相对复杂,因此单独进行分析。 插入操作 该操作其实就是红黑树的插入节点操作。前面分析过,红黑树是一种平衡二叉树,新增节点后可能导致其失去平衡,因此需要对其进行 阅读全文
posted @ 2019-07-02 00:18 WriteOnRead 阅读(179) 评论(0) 推荐(0)
摘要:概述 前面数据结构与算法笔记对红黑树进行了分析,而 TreeMap 内部就是基于红黑树实现的。示意图: 它的查找、插入、删除操作的时间复杂度均为 O(logn)。 TreeMap 类的继承结构如下: 类签名: TreeMap 实现了 Map 接口,其内部数据格式是“键-值对”的形式(Entry),排 阅读全文
posted @ 2019-07-01 23:58 WriteOnRead 阅读(288) 评论(0) 推荐(0)
摘要:Map 接口 Map 是一个接口,它表示一种“键-值(key-value)”映射的对象(Entry),其中键是不重复的(值可以重复),且最多映射到一个值(可以理解为“映射”或者“字典”)。 Map 常用的实现类有 HashMap、TreeMap、ConcurrentHashMap、LinkedHas 阅读全文
posted @ 2019-07-01 23:21 WriteOnRead 阅读(414) 评论(0) 推荐(0)
摘要:概述 相较于 ArrayList,LinkedList 在平时使用少一些。 LinkedList 内部是一个双向链表,并且实现了 List 接口和 Deque 接口,因此它也具有 List 的操作以及双端队列和栈的性质。双向链表的结构如下: 前文分析了 Queue 和 Deque 接口,正是因为 L 阅读全文
posted @ 2019-06-29 10:06 WriteOnRead 阅读(167) 评论(0) 推荐(0)
摘要:概述 Queue 和 Deque 都是接口。其中 Queue 接口定义的是一个队列,它包含队列的基本操作:入队(enqueue)和出队(dequeue)。 Deque 接口继承自 Queue 接口,表示双端队列(Double-ended queue),同时具备「队列」和「栈」的性质。二者的继承关系如 阅读全文
posted @ 2019-06-29 01:14 WriteOnRead 阅读(176) 评论(0) 推荐(0)
摘要:概述 上文「JDK源码分析-ArrayList」主要分析了 ArrayList 的实现原理。本文分析 List 接口的另一个实现类:Vector。 Vector 的内部实现与 ArrayList 类似,也可以理解为一个「可变数组」。其继承结构如下(省略部分接口): PS: 由于 Vector 目前使 阅读全文
posted @ 2019-06-29 01:06 WriteOnRead 阅读(163) 评论(0) 推荐(0)
摘要:概述 ArrayList 是 List 接口的一个实现类,也是 Java 中最常用的容器实现类之一,可以把它理解为「可变数组」。 我们知道,Java 中的数组初始化时需要指定长度,而且指定后不能改变。ArrayList 内部也是一个数组,它对数组的功能做了增强:主要是在容器内元素增加时可以动态扩容, 阅读全文
posted @ 2019-06-29 00:54 WriteOnRead 阅读(161) 评论(0) 推荐(0)
摘要:List 是最常用的容器之一。之前提到过,分析源码时,优先分析接口的源码,因此这里先从 List 接口分析。List 方法列表如下: 由于上文「JDK源码分析-Collection」已对 Collection 接口的方法进行了简要分析,而 List 接口继承自 Collection,因此这里只分析一 阅读全文
posted @ 2019-06-29 00:45 WriteOnRead 阅读(174) 评论(0) 推荐(0)
摘要:Java 集合框架(Java Collections Framework, JCF)包含很多平时开发中的常用类,例如 List、Set、ArrayList、HashMap、HashSet 等,因此打算先从这里下手。 而 Collection 接口又是集合层次中的根接口,最常用的 List 和 Set 阅读全文
posted @ 2019-06-29 00:38 WriteOnRead 阅读(196) 评论(0) 推荐(0)
摘要:今天用到了键-值对,于是想起了 Java 的 Map,由于之前并不很熟悉,就看了下源码,如下: PS: 看过后才清楚的知道 Map 是一个接口,而 HashMap 则是实现 Map 接口的一个类。而且觉得源码写得很美!以后要多看。 version: jdk1.7.0_79 Map 的遍历,示例代码: 阅读全文
posted @ 2016-04-15 19:14 WriteOnRead 阅读(239) 评论(0) 推荐(0)

1