JDK源码阅读
YupyMan
热爱编程,享受生活
展开
-
Selector、SelectionKey和Channel 源码联合解析
Selector、SelectionKey和Channel 这三个组件构成了Java nio包的核心,也是Reactor模型在代码层面的体现。Selector能让单线程同时处理多个客户端Channel,非常适用于高并发,传输数据量较小的场景。要使用Selector,首先要将对应的Channel及IO事件(读、写、连接)注册到Selector,注册后会产生一个SelectionKey对象,用于关联Selector和Channel,及后续的IO事件处理。这三者的关系如下图所示。对nio编程不熟的同学可以搜索原创 2020-08-23 22:39:22 · 673 阅读 · 0 评论 -
详解AbstractQueuedSynchronizer抽象类
简介AbstractQueuedSynchronizer 是Doug Lea大师创作的用来构建锁或者其他同步组件的基础框架类。J.U.C中许多锁和并发工具类的核心实现都依赖于AQS,如:ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch 等。AQS的源码中 方法很多,但主要做了三件事情:管理 同步状态;维护 同步队列;阻塞和唤醒 线程。另外,从行为上来区分就是 获取锁 和 释放锁,从模式上来区分就是 独占锁 和 共享锁。原创 2020-07-18 22:20:24 · 332 阅读 · 0 评论 -
LinkedHashMap容器类 源码赏析
HashMap 大家都清楚,底层是 数组 + (红黑树 / 链表),元素是无序的,而 LinkedHashMap 则比 HashMap 多了这一个功能,并且,LinkedHashMap 的有序可以按两种顺序排列,一种是按照插入的顺序,一种是按照访问的顺序(初始化LinkedHashMap对象时设置accessOrder参数为true),而其内部是靠 建立一个双向链表 来维护这个顺序的,在每次插入、删除后,都会调用一个函数来进行 双向链表的维护,这也是实现 LRU Cache 功能的基础。先说几个比较重要的原创 2020-07-05 20:03:19 · 259 阅读 · 0 评论 -
HashSet容器类 源码赏析
HashSet 本身并没有什么特别的东西,它提供的所有集合核心功能,都是基于HashMap来实现的。如果了解HashMap源码的实现,HashSet 源码看起来跟玩一样。我的博客中有专门分析HashMap源码的文章,不熟悉的请自行翻阅。HashSet 的特点如下:内部使用HashMap的key存储元素,以此来保证元素不重复;HashSet是无序的,因为HashMap的key是无序的;HashSet中允许有一个null元素,因为HashMap允许key为null;HashSet是非线程安全的。原创 2020-07-03 23:25:27 · 151 阅读 · 0 评论 -
String类源码详解
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** 保存String的字节数组 */ private final char value[]; /** 缓存这个String的hash值 */ private int hash; // Default to 0 /** use serialVers原创 2020-06-19 20:39:44 · 775 阅读 · 0 评论 -
ConcurrentHashMap 源码赏析
HashMap 源码中主要了解其核心源码及实现逻辑。ConcurrentHashMap 就不再重复那些数据结构相关的内容咯,这里重点看一下它的并发安全实现。源码如下。public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Ser...原创 2020-04-01 22:39:37 · 150 阅读 · 0 评论 -
HashMap 源码赏析
作为工作中最重要、最常用的容器之一,当然还是要自己动手写一篇 HashMap 的源码解析来加深对其的印象咯,而且它的设计与实现 也有很多值得学习的地方。源码赏析JDK1.8 的HashMap 底层使用的是 动态数组,数组中元素存放的是 链表或红黑树。核心源码如下。public class HashMap<K,V> extends AbstractMap<K,V> im...原创 2020-04-01 21:43:33 · 150 阅读 · 0 评论 -
ThreadLocal 源码赏析
前面我们分析了 Thread类的源码,有了前面的铺垫,通过源码 理解ThreadLocal的秘密就容易多了。ThreadLocal类 提供了 get/set线程局部变量的实现,ThreadLocal成员变量与正常的成员变量不同,每个线程都可以通过 ThreadLocal成员变量 get/set自己的专属值。ThreadLocal实例 通常是类中的私有静态变量,常用于将状态与线程关联,例如:用户I...原创 2020-03-31 22:31:03 · 240 阅读 · 0 评论 -
java.lang.Thread 源码赏析
本来想看 ThreadLocal 的源码的,但发现其中最重要的 get/set 方法都是操纵的 Thread类 中的 threadLocals变量 (java.lang.ThreadLocal.ThreadLocalMap),索性先来看一下 Thread 的源码吧,可以留意一下其中与 ThreadLocal 相关的属性,这样下次阅读 ThreadLocal 的核心API时,就能够轻易理解其原理咯。...原创 2020-03-30 23:03:58 · 439 阅读 · 0 评论 -
Lock锁组件 (J.U.C) 源码赏析
类图结构J.U.C 的锁组件中 类相对较少,从JDK相应的包中也能看出来,下图标记了其中最主要的几个接口和类,也是本文要分析的重点。下图 将这几个接口和类 以类图的方式展现出来,其中包含了它们所声明的主要方法。Lock 组件Lock 组件的结构很简单,只有一个接口和一个实现类,源码如下。public interface Lock { /** * 获取锁 ...原创 2020-03-16 21:02:04 · 254 阅读 · 0 评论 -
Executor 线程池组件 源码赏析
线程池核心组件图解看源码之前,先了解一下该组件 最主要的几个 接口、抽象类和实现类的结构关系。该组件中,Executor 和 ExecutorService接口 定义了线程池最核心的几个方法,提交任务submit()、关闭线程池shutdown()。抽象类 AbstractExecutorService 主要对公共行为 submit()系列方法进行了实现,这些 submit()方法 的实现...原创 2020-03-15 22:54:36 · 150 阅读 · 0 评论