源码

源码看不懂?来看看,阿里P 7架构师亲授述Spring源码深度解析。

人盡茶涼 提交于 2020-03-20 18:31:28
3 月,跳不动了?>>> 源代码的重要性 Java开发人员都知道,阅读源码是一个非常 好的学习方式,在我们日常工作中或多或少都会接触一些开源代码,比如说最常用的Struts、Hibermate. Spring,这些源码的普及与应用程度远远超过我们的想象,正因为很多人使用,也在推动着源码不断地去完善。这些优秀的源码中有着多年积淀下来的精华,这些精华是非常值得我们学习的,不管我们当前是什么水平,通过反复阅读源码能力能有所提升,小到对源码所提供的功能上的使用更加熟练,大到使我们的程序设计更加完美优秀。但是,纵观我们身边的人,能够做到通读源码的真的是少之又少,究其原因不外乎以下几点。 1 .阅读源码绝对算得上是一 件费时费力的工作,需要读者耗费大量的时间去完成。而作为开发人员,毕竞精力有限,实在没办法拿出太多的时间放在源码的阅读上。 2 .源码的复杂性。 任何一款源码经历了多年的发展与提炼,其复杂程度可想而知。当我们阅读源码的时候,大家都知道需要通过工具来跟踪代码的运行,进而去分析程序。但是,当代码过于复杂,环环相扣绕来绕去的时候,跟进了几十个甚至几百个函数后,这时我们已经不知道自己所处的位置了,不得不再重来, 但是一次又一次的,最终发现自己根本无法驾驭它,不得不放弃。 3 .有些源码发展多年,会遇到各种各样的问题,并对问题进行了解决,而这些问题有的对于我们来说甚至可以用莫名其妙来修饰

spring ioc源码分析

故事扮演 提交于 2020-03-20 17:36:04
3 月,跳不动了?>>> Spring源码解析 先看看我们的启动代码 ClassPathXmlApplicationContext cp = new ClassPathXmlApplicationContext("applicationContext.xml"); TextImpl text = (TextImpl) cp.getBean("tt"); text.print(); 1.ClassPathXmlApplicationContext 点击ClassPathXmlApplicationContext看看创建对象时发生了什么 public ClassPathXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws BeansException { super(parent); // 传入我们的application.xml的路径 setConfigLocations(configLocations); if (refresh) { // 这里是我们的核心部分,让我们进入看看 refresh(); } } AbstractApplicationContext.java 如果不抛异常,一共执行了13个方法

从源码和日志文件结构中分析 Kafka 重启失败事件

我是研究僧i 提交于 2020-03-20 09:14:13
3 月,跳不动了?>>> 上次的 Kafka 重启失败事件,对为什么重启失败的原因似乎并没有解释清楚,那么我就在这里按照我对 Kafka 的认识,从源码和日志文件结构去尝试寻找原因。 从源码中定位到问题的根源 首先把导致 Kafka 进程退出的异常栈贴出来: 注:以下源码基于 kafka 0.11.0.2 版本。 我们直接从 index 文件损坏警告日志的位置开始: kafka.log.Log#loadSegmentFiles 从前一篇文章中已经说到,Kafka 在启动的时候,会检查kafka是否为 cleanshutdown,判断依据为 ${log.dirs} 目录中是否存在 .kafka_cleanshutDown 的文件,如果非正常退出就没有这个文件,接着就需要 recover log 处理,在处理中会调用 。 在 recover 前,会调用 sanityCheck() 方法用于检验每个 log sement 的 index 文件,确保索引文件的完整性 ,如果发现索引文件损坏,删除并调用 recoverSegment() 方法进行索引文件的重构,最终会调用 recover() 方法: kafka.log.LogSegment#recover 源码中相关变量说明: log:当前日志 Segment 文件的对象; batchs:一个 log segment 的消息压缩批次;

ConcurrentHashMap源码解析(1.8)

末鹿安然 提交于 2020-03-20 07:58:47
一、简介 上篇文章 详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理。 首先在看本文之前,希望对HashMap有一个详细的了解。不然看直接看ConcurrentHashMap的源码还是有些费劲的。 相信对HashMap,HashTable有一定了解,应该知道HashMap是不具备线程安全性的,在resize时会丢数据(JDK8),而HashTable虽然保证了线程安全性,但是其是通过给每个方法加Synchronized关键字达到的同步目的。但是都知道Synchronized在竞争激烈的多线程并发环境中,在性能上的表现是非常不如人意的。那在高并发环境中HashMap如何保证线程安全而又不浪费太多性能呢?答案就是Java J.U.C并发包中的ConcurrentHashMap。 依然开局一张图。JDK8中的ConcurrentHashMap数据结构。 呃呵,和HashMap的结构是一样的,没错在数据结构层面,ConcurrentHashMap和HashMap是完全一样的。有了这个基础继续往下看。 二、历史版本 ConcurrentHashMap的历史版本大致分界线在JDK8。也就是可以分为JDK8和JDK8以前版本。 数据结构的区别 在JDK8之前HashMap没有引入红黑树,同样的ConcurrentHashMap也没有引入红黑树

【JUC】JDK1.8源码分析之ReentrantLock(三)

你。 提交于 2020-03-20 03:44:15
一、前言   在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看ArrayBlockingQueue源码会很容易,下面开始正文。 二、ArrayBlockingQueue数据结构   通过源码分析,并且可以对比ArrayList可知,ArrayBlockingQueue的底层数据结构是数组,数据结构如下   说明:ArrayBlockingQueue底层采用数据才存放数据,对数组的访问添加了锁的机制,使其能够支持多线程并发。 三、ArrayBlockingQueue源码分析    3.1 类的继承关系    public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable {}   说明:可以看到ArrayBlockingQueue继承了AbstractQueue抽象类,AbstractQueue定义了对队列的基本操作;同时实现了BlockingQueue接口,BlockingQueue表示阻塞型的队列,其对队列的操作可能会抛出异常;同时也实现了Searializable接口,表示可以被序列化。   

Tomcat中的Listener源码片段解读

試著忘記壹切 提交于 2020-03-19 19:08:57
@Override public <T extends EventListener> void addListener(T t) { if (!context.getState().equals(LifecycleState.STARTING_PREP)) { throw new IllegalStateException( sm.getString("applicationContext.addListener.ise", getContextPath())); } boolean match = false; if (t instanceof ServletContextAttributeListener || t instanceof ServletRequestListener || t instanceof ServletRequestAttributeListener || t instanceof HttpSessionIdListener || t instanceof HttpSessionAttributeListener) { context.addApplicationEventListener(t); match = true; } if (t instanceof HttpSessionListener || (t instanceof

Nginx 单元测试自动化浅析之一-Test::Nginx源码分析和使用

北战南征 提交于 2020-03-19 12:53:32
3 月,跳不动了?>>> http://www.taobaotest.com/blogs/2433 主题 Nginx 源码分析 单元测试 Nginx 单元测试自动化浅析之一 -Test::Nginx 源码分析和使用 Test::Nginx 是用来进行 Nginx 测试的一个 perl 语言的框架。该框架提供动态编写、更改 nginx 配置文件的功能,提供 Nginx 服务器启动关闭的功能以及提供 http 请求等功能。接下来通过分析源码来介绍该测试框架的使用。 源码分析 接下来介绍 Test::Nginx 测试框架中常用的功能的实现,主要包括构造函数, Nginx 配置文件的加载,服务器的启动,服务的获取,以及服务器的关闭的实现。 构造函数: 使用 Test::Nginx 模块应该先调用其构造函数,在 perl 中的构造函数是调用的是 new() 方法。构造函数完成了测试需要的临时文件夹的建立,构造函数源码如下: 其中 $self->{_testdir} 实例化 hash 变量,并在 /tmp/ 文件夹下创建名为 nginx-test-XXXXXXXXXX 的文件夹, XXXXXXXXXX 表示这些位的文件夹名称为随机生成。理论每次实例化对象时创建的文件夹名称都不一样。 通过在测试用例中用 Test::Nginx->new() 来获取 Test::Nginx 的实例。 Nginx

转:gcc编译C++程序

≯℡__Kan透↙ 提交于 2020-03-19 09:53:41
转:http://blog.csdn.net/liujiayu2/article/details/49864381 单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: [cpp] view plain copy print ? /* helloworld.cpp */ #include <iostream> int main( int argc, char *argv[]) { std::cout << "hello, world" << std::endl; return(0); } 程序使用定义在头文件 iostream 中的 cout,向标准输出写入一个简单的字符串。该代码可用以下命令编译为可执行文件: $ g++ helloworld.cpp 编译器 g++ 通过检查命令行中指定的文件的后缀名可识别其为 C++源代码文件。编译器默认的动作:编译源代码文件生成对象文件(object file),链接对象文件和 libstdc++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序可以这样来运行: $ ./a.out hello, world 更普遍的做法是通过 -o 选项指定可执行程序的文件名。下面的命令将产生名为 helloworld 的可执行文件

集合框架系列 Map(十一):LinkeHashMap

a 夏天 提交于 2020-03-18 18:31:25
目录 1 概述 2 原理 3 源码分析  3.0 Entry 的继承体系  3.1 链表的建立过程  3.2 链表节点的删除过程  3.3 访问顺序的维护过程  3.4 基于 LinkedHashMap 实现缓存 4 总结 1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。除此之外,LinkedHashMap 对访问顺序也提供了相关支持。在一些场景下,该特性很有用,比如缓存。在实现上,LinkedHashMap 很多方法直接继承自 HashMap,仅为维护双向链表覆写了部分方法。所以,要看懂 LinkedHashMap 的源码,需要先看懂 HashMap 的源码。关于 HashMap 的源码分析,本文并不打算展开讲了。大家可以参考我之前的一篇文章“ HashMap 源码详细分析(JDK1.8) ”。在那篇文章中,我配了十多张图帮助大家学习 HashMap 源码。 本篇文章的结构与我之前两篇关于 Java 集合类( 集合框架 )的源码分析文章不同,本文将不再分析集合类的基本操作(查找、遍历、插入、删除),而是把重点放在双向链表的维护上。包括链表的建立过程,删除节点的过程,以及访问顺序维护的过程等。好了,接下里开始分析吧。 2. 原理 上一章说了

集合框架系列 Map(十二):TreeMap(1.8)

别来无恙 提交于 2020-03-18 18:28:37
目录 一 简介 二 概览 三 源码分析  3.1 查找  3.2 遍历  3.3 插入  3.4 删除 一、简介 TreeMap 最早出现在 JDK 1.2 中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于 红黑树 实现,可保证在 log(n) 时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很高。另一方面,由于 TreeMap 基于红黑树实现,这为 TreeMap 保持键的有序性打下了基础。总的来说,TreeMap 的核心是红黑树,其很多方法也是对红黑树增删查基础操作的一个包装。所以只要弄懂了红黑树,TreeMap 就没什么秘密了。 二、概览 TreeMap 继承自 AbstractMap ,并实现了 NavigableMap 接口。NavigableMap 接口继承了 SortedMap 接口,SortedMap 最终继承自 Map 接口,同时 AbstractMap 类也实现了 Map 接口。以上就是 TreeMap 的继承体系,描述起来有点乱,不如看图了: 上图就是 TreeMap 的继承体系图,比较直观。这里来简单说一下继承体系中不常见的接口 NavigableMap 和 SortedMap ,这两个接口见名知意。先说 NavigableMap 接口,NavigableMap 接口声明了一些列具有导航功能的方法