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

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

然后借助 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. 四、mybatis动态sql

    # 前言前面mysql都是通过静态sql进行查询的,但是如果业务复杂的时候,我们会遇到引号问题,或者多一个空格,这就使得sql代码编写错误了,所以为了解决这个问题,我们有了动态sql. Mybatis ...

  2. Docker部署Mysql,如何开启binlog

    0.拉取镜像 sudo docker pull mysql:5.7 1.创建存放映射文件夹 mkdir -p mydata/mysql/log mkdir -p mydata/mysql/data m ...

  3. 寻找写代码感觉(五)之Mybatis官方代码生成器的使用

    一.Mybatis Generator生成器 见名知意,官方给出的代码生成器.好处就是不用自己写实体类.接口.xml文件了,应对简单增删改查是可以的.复杂的还是需要自己手写sql的. 二.Mybati ...

  4. Linux7安装redis6

    首先下载软件包并解压 cd /opt wget https://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5. ...

  5. 题解 AVL 树

    link Description 给出一个 \(n\) 个点的 AVL 树,求保留 \(k\) 个点使得字典序最小. \(n\le 5\times 10^5\) Solution 因为我很 sb ,所 ...

  6. centos无法建立ssl连接

    在centos下使用wget安装mysql5.7时,提示无法建立ssl连接 查阅资料,在命令wget后加上 --no-check-certificate也还是无法建立SSL连接. 后来,觉得可能是由于 ...

  7. 好奇!仅 13kB 大小的游戏,源码长啥样?

    这个马赛克风格的表情正好 13Kb,有人竟然能用一个表情大小的空间,制作个游戏出来.我就不信这么点的地儿,能写出个花来?游戏能好玩吗?因为这些游戏点开就能玩,我抱着试一试的心态把玩了一会. 事实证明是 ...

  8. LDAP-初见

    目录 什么是LDAP? LDAP 协议能解决什么问题? Spring Boot中使用LDAP来统一管理用户信息 添加用户 连接LDAP服务端 什么是LDAP? LDAP 的全称是 Lightweigh ...

  9. Poetry(2)Poetry的基本使用方式

    Poetry的基本使用 准备工作 如果你是在一个已有的项目里使用Poetry,你只需要执行 poetry init 命令来创建一个 pyproject.toml 文件: poetry init 可看到 ...

  10. webRTC中语音降噪模块ANS细节详解(二)

    上篇(webRTC中语音降噪模块ANS细节详解(一))讲了维纳滤波的基本原理.本篇先给出webRTC中ANS的基本处理过程,然后讲其中两步(即时域转频域和频域转时域)中的一些处理细节. ANS的基本处 ...