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 ...
随机推荐
- springweb项目自定义拦截器修改请求报文头
面向切面,法力无边,任何脏活累活,都可以从干干净净整齐划一的业务代码中抽出来,无非就是加一层,项目里两个步骤间可以被分层的设计渗透成筛子. 举个例子: 最近我们对接某银行接口,我们的web服务都是标准 ...
- Mybatis里@InsertProvider、@UpdateProvider方法里使用if test标签
例如: ··· insert into TEST1(<if test="base_id!=null and base_id!=''">base_id,</if&g ...
- spring boot处理跨域请求代码
@Configuration @WebFilter(filterName = "CorsFilte") public class CorsFilter implements Fil ...
- DDD领域驱动设计落地实践(十分钟看完,半小时落地)
一.引子 不知今年吹了什么风,忽然DDD领域驱动设计进入大家视野.该思想源于2003年 Eric Evans编写的"Domain-Driven Design领域驱动设计"简称DDD ...
- CSS常见的5种垂直水平居中(面试够用)
方法一 (flex) <div id='box'> <div class='child'></div> </div> #box{ width:200px ...
- 2021-06-27 & 2021-06-28 集训题解
西克 题目传送门 Description Solution 跟 2021年省选A卷D2T1 一模一样,懒得讲了 不过这个题似乎有点卡空间,所以卡不过去 Code #include <bits/s ...
- FFT 的一些技巧
三次变两次 FFT 我们发现: \[(F(x)+iG(x))^2=F(x)^2-G(x)^2+2iF(x)G(x) \] 也就是说,我们把 \(F(x)\) 作为实部,\(G(x)\) 作为虚部,那么 ...
- 洛谷3721 HNOI2017单旋(LCT+set+思维)
这题难道不是spaly裸题吗? 言归正传QWQ 一看到这个题目,其实第一反应是很懵X的 从来没有见过类似的题目啊,什么\(spaly\),单旋.QWQ很懵逼啊 不过,我们可以注意到这么一件事情,就是我 ...
- BG的本性
BG的本性 更舒适的体验 算法一: 我还会暴力!模拟一下 复杂度 \(O(nm)\), 期望得分10 算法二: 用线段树优化枚举,直接找可行点 复杂度 \(O(\mathrm{ans} \log_2 ...
- Visual Studio 重置窗口布局
Visual Studio 重置窗口布局