Java 源码如何分析?
如何阅读源码?万事开头难,源码从哪里开始看?我也是刚对源码的阅读研究不深,但是可以谈谈自己的源码阅读感受。
刚开始吧,只是对某些代码的实现原理感到好奇,好奇是怎么实现这种功能,实现这种效果的,对其背后的原理充满了求知欲。
然后借助 IDEA 以及翻译插件(本人英语桐油罐子,但这不影响我对原理的探索)一步步查看源码,调试,但是像无头苍蝇一样不知道哪里是重点,也就很难去理解源码的思想。
后来源码看多了,稍微有些经验了,就知道应该首先了解这项技术的基本原理(可以去百度、看博客),然后通过 IDEA 查看它的继承关系,有哪些构造方法,都有些什么参数。
再然后通过它主要的方法一步步深入了解,只是了解无需做底层的深入研究。当了解它的基本架构后,再针对某一块代码深入探索,这样既能把握整个技术的基本架构,对于深入研究也是很有好处的。
比如现在我想了解 RocketMQ 的技术底层,那么首先我得知道它是用来干嘛的,了解一下它的基本架构原理。MQ 嘛,消息中间件,都需要路由、消息服务器这些基本组件。
其本质上也是通过脚本启动的一个 java 进程,那么我就可以通过这个启动脚本作为入口,去探索 RocketMQ 是如何启动、提供服务的。
通过研究它的启动类,发现是读取了配置,做了一些初始化的操作。
像这样我就知道了 RocketMQ 是如何启动的,然后再探索它初始化了一些什么东西,比如它有一堆线程池、一些存储服务、网络服务。
通过这些就能一步步深入了解它实现某些功能的原理,比如说 RocketMQ 的海量存储原理、支持高并发的原理。按照这种步骤,通过阅读 RocketMQ 的源码,一步步的了解其架构原理。
再比如我想了解线程池的技术底层,首先我知道,线程池嘛,里面有很多线程用来处理任务嘛,这就是我对线程池最原始的理解。
在我还不会用的时候,我去网上搜索线程池这个技术,发现一大堆的教程啊、遇到什么什么 bug 的解决方法啊、要不就是 jdk 预备的那几个线程池的描述、使用啊。
而把线程池这个东西说清楚的很少,让人感觉都很有道理,但是对自己好像一点用都没有。
所以嘛,要讲究方法。
既然要了解线程池这项技术的原理,首先要知道什么是线程池(现在已经知道啦),然后有哪些线程池(JDK预备的、自定义的),再就是各个线程池有什么区别,然后首先得用起来,比如写几个 demo 玩玩。
顺便浅显的了解下他们的实现,发现他们都是使用的 ThreadPoolExecutor 实现的,然后自定义也是 ThreadPoolExecutor 实现的,既然如此 ThreadPoolExecutor 就是线程池的重点,那么 ThreadPoolExecutor 就是我学习线程池原理的突破口。
首先使用 IDEA 查看它的继承关系、构造函数、类属性等,然后从我使用线程池的时候,使用的 execute 方法作为了解其原理的入口,然后带着自己的疑问去深入探索。
比如线程池这个池子怎么存储线程的?原来在线程池内部,线程被包装成了 Worker 对象,然后把 Worker 对象放在 HashSet 集合中,所以线程池实际上就是一个 Worker 的 Set 集合,然后所有的线程操作都是基于 Worker 对象进行操作的。
顺着这种思路去了解线程池的原理,比之前无脑乱入要好很多了。
Java 源码如何分析?的更多相关文章
- java源码-ConcurrentHashMap分析-1
ConcurrentHashMap源码分析 版本jdk8 摈弃了jdk7之前的segement段锁: 首先分析一下put方法,大致的流程就是首先对key取hash函数 判断是否first节点是否存在 ...
- [Java] Hashtable 源码简要分析
Hashtable /HashMap / LinkedHashMap 概述 * Hashtable比较早,是线程安全的哈希映射表.内部采用Entry[]数组,每个Entry均可作为链表的头,用来解决冲 ...
- Java源码分析 | CharSequence
本文基于 OracleJDK 11, HotSpot 虚拟机. CharSequence 定义 CharSequence 是 java.lang 包下的一个接口,是 char 值的可读序列, 即其本身 ...
- [Java] LinkedHashMap 源码简要分析
特点 * 各个元素不仅仅按照HashMap的结构存储,而且每个元素包含了before/after指针,通过一个头元素header,形成一个双向循环链表.使用循环链表,保存了元素插入的顺序. * 可设置 ...
- [Java] HashMap 源码简要分析
特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似. 源码简要分析 pu ...
- MapReduce的ReduceTask任务的运行源码级分析
MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...
- TaskTracker任务初始化及启动task源码级分析
在监听器初始化Job.JobTracker相应TaskTracker心跳.调度器分配task源码级分析中我们分析的Tasktracker发送心跳的机制,这一节我们分析TaskTracker接受JobT ...
- 解密随机数生成器(二)——从java源码看线性同余算法
Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...
- LinkedHashMap 源码详细分析(JDK1.8)
1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...
随机推荐
- 让selenium规避网站的检测
在使用selenium对某些网站模拟访问的时候会被检测出来,检测出来之后就有可能拿不到我们想要的数据,那么我们怎么可以规避掉呢? 在使用谷歌浏览器的时候我们右键-检查-console-输入window ...
- 定要过python二级 选择题第5套
1. 2.. 3. https://zhidao.baidu.com/question/1952133724016713828.html 4. 5. 6. 7. 8. 9. 10. 11.
- HTML 网页开发、CSS 基础语法——六. HTML基本结构
1.基本骨架 HTML文件最基本的四个标签,组成了网页的基本骨架,包括:<html>. <head>.<title>.<body>四组标签. ① < ...
- 鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案 | 百篇博客分析OpenHarmony源码 | v30.02
百篇博客系列篇.本篇为: v30.xx 鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当 ...
- PolarDB PostgreSQL 架构原理解读
背景 PolarDB PostgreSQL(以下简称PolarDB)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容PostgreSQL与Oracle.PolarDB 的存储与计算能 ...
- IP多播与NAT地址转化
IP多播 与单播相比,在一对多的通信中,多播可以大大减少网络资源.在互联网上进行多播就叫做IP多播,IP多播所传送的分组需要使用IP多播地址. 如果某台主机想要收到某个特定的多播分组,那么怎样才能是这 ...
- 浅尝装饰器--property装饰器
[写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] property属性:将类方法用类属性的形式进行调用 class Good: def __init__ ...
- ES2020新特性记录
1.可选链操作符 // oldlet ret = obj && obj.first && obj.first.second// newlet ret = obj?.fi ...
- AgileConfig 轻量级配置中心 1.5 发布 - 支持多环境配置
AgileConfig 从发布到现在,收到不同学的 issue 说需要多环境的支持.也就是一个应用在不同的环境下可以配置不同的配置项.这是一个非常有用的功能,就跟我们开发的时候会设置多个 appset ...
- Takin Talks·上海 |开源后首场主题研讨会来了,一起解密Takin技术吧!
自 6 月 25 日全球首款生产环境全链路压测平台 Takin 正式开源,短短 13 天时间,Github 主页上 Star 数已超过 730,开发者社群也积累了 1500+粉丝.群内技术研讨氛围 ...