如何阅读源码?万事开头难,源码从哪里开始看?我也是刚对源码的阅读研究不深,但是可以谈谈自己的源码阅读感受。

刚开始吧,只是对某些代码的实现原理感到好奇,好奇是怎么实现这种功能,实现这种效果的,对其背后的原理充满了求知欲。

然后借助 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 源码如何分析?的更多相关文章

  1. java源码-ConcurrentHashMap分析-1

    ConcurrentHashMap源码分析 版本jdk8 摈弃了jdk7之前的segement段锁: 首先分析一下put方法,大致的流程就是首先对key取hash函数 判断是否first节点是否存在 ...

  2. [Java] Hashtable 源码简要分析

    Hashtable /HashMap / LinkedHashMap 概述 * Hashtable比较早,是线程安全的哈希映射表.内部采用Entry[]数组,每个Entry均可作为链表的头,用来解决冲 ...

  3. Java源码分析 | CharSequence

    本文基于 OracleJDK 11, HotSpot 虚拟机. CharSequence 定义 CharSequence 是 java.lang 包下的一个接口,是 char 值的可读序列, 即其本身 ...

  4. [Java] LinkedHashMap 源码简要分析

    特点 * 各个元素不仅仅按照HashMap的结构存储,而且每个元素包含了before/after指针,通过一个头元素header,形成一个双向循环链表.使用循环链表,保存了元素插入的顺序. * 可设置 ...

  5. [Java] HashMap 源码简要分析

    特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似.   源码简要分析 pu ...

  6. MapReduce的ReduceTask任务的运行源码级分析

    MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...

  7. TaskTracker任务初始化及启动task源码级分析

    在监听器初始化Job.JobTracker相应TaskTracker心跳.调度器分配task源码级分析中我们分析的Tasktracker发送心跳的机制,这一节我们分析TaskTracker接受JobT ...

  8. 解密随机数生成器(二)——从java源码看线性同余算法

    Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...

  9. LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

随机推荐

  1. PolarDB PostgreSQL 快速入门

    什么是PolarDB PostgreSQL PolarDB PostgreSQL(下文简称为PolarDB)是一款阿里云自主研发的云原生数据库产品,100%兼容PostgreSQL,采用基于Share ...

  2. Hibernate 的 <= 出现问题

    问题模拟 select new map( e.name as name , e.salary as salary) from Emplpyee e where e.salary <= :sala ...

  3. amber模拟kcl水溶液

    最近刚开始学习amber软件,看网上的教程勉强知道怎么操作这个amber了.就暂时跑了个分子动力学,其他的啥也没处理.先把我的操作过程记录下来吧,免得日后忘记. 一.构建kcl.pdb结构 利用Gau ...

  4. Hbase修复工具Hbck

    因为前面Hbase2集群出现过一次故障,当时花了一个周末才修好,就去了解整理了一些hbase故障的,事故现场可以看前面写的一篇:Hbase集群挂掉的一次惊险经历 一. HBCK一致性 一致性是指Reg ...

  5. 最新.NET MAUI有什么惊喜?

    .NET 6 Preview 7 现已发布啦,我们为 .NET 多平台应用程序 UI (MAUI) 引入了所有的新布局.这是性能和可靠性的重大变化.我们很高兴我们还增加了一些关于accessibili ...

  6. 试题 历届试题 核桃的数量 java题解

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: ...

  7. 👊 Spring技术原理系列(7)带你看看那些可能你还不知道的Spring特性技巧哦!

    前提介绍 本文主要介绍相关Spring框架的一些新特性问题机制,包含了一些特定注解方面的认识. @Lazy可以延迟依赖注入 @Lazy注解修饰在类层面! @Lazy @Service public c ...

  8. 【错误分析】NX error status: 32

    在进行NX 制图里面的表格注释合并单元格时,总是报错NX error status: 32,找了很久都不知道问题所在. 报错提示如下: NXOpen.NXException: NX error sta ...

  9. Golang通脉之函数

    函数是组织好的.可重复使用的.用于执行指定任务的代码块. Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民". 函数定义 Go语言中定义函数使用func关键字 ...

  10. 初学python-day4 字典(已更新完)