接上一篇继续分析一下runtime.newproc方法. 函数签名 newproc函数的签名为 newproc(siz int32, fn *funcval) siz是传入的参数大小(不是个数):fn对应的是函数,但并不是函数指针,funcval.fn才是真正指向函数代码的指针. // go/src/runtime/runtime2.go type funcval struct { fn uintptr // 真正指向函数代码的指针 } 关键字go 在golang中编译器会把类似 go foo(…
Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: public static void main(String args[]) {     try {       StringUtils.startupShutdownMessage(DataNode.class, args, LOG);       DataNode datanode = crea…
本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtime·rt0_go中在调用完runtime.newproc创建main goroutine后,就调用了runtime.mstart.让我们来分析一下这个函数. mstart mstart没什么太多工作,然后就调用了mstart1. func mstart() { _g_ := getg() // 在启…
上一篇文章<async-validator 源码学习(一):文档翻译>已经将 async-validator 校验库的文档翻译为中文,看着文档可以使用 async-validator 异步校验表单.本篇文章继续学习 async-validator 源码目录结构. 在项目中安装 async-validator: npm i async-validator 之后,找到 async-valiror 文件夹,打开 package.json 文件, 一.配置及目录结构 package.json 的代码如…
JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JDK源码的时候,有粗略的思考过,今天下班后又把<Thinking in Java>中关于final的内容重新看了一遍,对此写下一些关于自己的理解和想法. String类中final关键字的使用 final关键字,用来描述一块数据不能被改变,两种可能理由:设计.效率 final使用的三种情况:数据.方…
写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读取配置文件,将其经过编码并经过系列处理后,交给了同类中的doLoadBeanDefinitions()方法,这次就直接进入这个方法,来看看Spring到底是如何创建BeanDefinition的. 1.2 BeanDefinition的创建 - 创建BeanDefinition前的最终准备 首先进入…
本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println("Hello") } 开始调试 root@xiamin:~/study# dlv debug test.go Type 'help' for list of commands. (dlv) l > _rt0_amd64_linux() /root/go/src/runtime/rt0_linu…
本文所使用的golang为1.14,gdb为8.1. 一直以来对于函数调用都仅限于函数调用栈这个概念上,但对于其中的详细结构却了解不多.所以用gdb调试一个简单的例子,一探究竟. 函数调用栈的结构(以下简称栈) 栈包含以下作用: 存储函数返回地址. 保存调用者的rbp. 保存局部变量. 为被调用函数预留返回值内存空间. 向被调用函数传递参数. 每个函数在执行时都需要一段内存来保存上述的内容,这段内存被称为函数的"栈帧" 一般CPU中包含两个与栈相关的寄存器: rsp:始终指向整个函数调…
[^]: 以下源码分析基于JDK1.8 ReentrantLock 示例 private ReentrantLock lock = new ReentrantLock(true); public void f(){ try { lock.lock(); //do something } finally { lock.unlock(); } } 源码解析(公平锁-unlock流程) ReentrantLock#unlock() public void unlock() { sync.release…
大体思路(十) 本节内容: 1. baseoptions 参数分析 2. options 参数分析 3. parse 编译器 4. parseHTNL 函数解析 // parse 解析 parser--名词--解析器 ==> getShouldDecode() inBroeser // 监听所有的标签 //监听href shouldDecodeNewLines / shouldDecodeNewLinesForHref delimiters: options.delimiters //改变文本插…