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

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

然后借助 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. Spring Cloud Gateway 没有链路信息,我 TM 人傻了(下)

    本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...

  2. Python如何连接Mysql及基本操作

    什么要做python连接mysql,一般是解决什么问题的 做自动化测试时候,注册了一个新用户,产生了多余的数据,下次同一个账号就无法注册了,这种情况怎么办呢?自动化测试都有数据准备和数据清理的操作,如 ...

  3. fastjson将json转为Map<String,String>踩坑

    字符串 对于一个json字符串 String str = "{"specItem":"[红, 大]","specName":&qu ...

  4. Mysql集群搭建(多实例、主从)

    1 MySQL多实例 一 .MySQL多实例介绍 1.什么是MySQL多实例 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307,3308),运行多个MySQL服务进程,通 ...

  5. 带你读Paper丨分析ViT尚存问题和相对应的解决方案

    摘要:针对ViT现状,分析ViT尚存问题和相对应的解决方案,和相关论文idea汇总. 本文分享自华为云社区<[ViT]目前Vision Transformer遇到的问题和克服方法的相关论文汇总& ...

  6. 第十二章 Net 5.0 快速开发框架 YC.Boilerplate --千万级数据处理解决方案

    在线文档:http://doc.yc-l.com/#/README 在线演示地址:http://yc.yc-l.com/#/login 源码github:https://github.com/linb ...

  7. JS中变量的命名规范

    命名规范 包含数字.字母.下划线和$,但 不能以数字开头 变量名严格区分大小写 变量名不能是关键字和保留字 变量名要见名知意 如果变量名有多个单词组成,推荐使用 小驼峰命名法 命名时,尽量使用英语,如 ...

  8. C#开发BIMFACE系列45 服务端API之创建离线数据包

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] BIMFACE的常规应用方式有公有云与私有化部署两种方式,并且浏览模型或者图纸需要使用ViewToken,ViewToke ...

  9. linux下nginx编译安装、版本信息修改

    环境 centos 7 安装依赖包 yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel zlib zlib-devel opens ...

  10. SpringBoot整个Druid

      Druid简介 Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池. Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0.DBCP 等 ...