源码

【源码分析】你必须知道的string.IsNullOrEmpty && string.IsNullOrWhiteSpace

有些话、适合烂在心里 提交于 2020-01-22 05:50:52
目录 写在前面 string.IsNullOrEmpty源码分析 string.IsNullOrWhiteSpace源码分析 总结 写在前面 之前自信撸码时踩了一次小坑,代码如下: private static void AppServer_NewMessageReceived(WebSocketSession session, string value) { if (string.IsNullOrEmpty(value)) { return; } value = HttpUtility.UrlDecode(value); SuperSocketTemp<string> model = JsonConvert.DeserializeObject<SuperSocketTemp<string>>(value); //具体业务... } 就是这段代码在测试环境抛错,说起来全是泪啊。这段代码的具体业务场景是Websocket即时通讯接收来自客户端的消息,消息以json字符串的形式传输。首先判断是否空字符串,如果不是,为了防止乱码进行Url解码,然后反序列化消息解析成需要的数据格式,最后执行具体的业务操作。 测试环境抛的错是万恶的“未将对象引用到对象的实例”,很简单就可以定位到问题的所在——反序列化失败了,只要在序列化之后执行具体业务逻辑之前加上非空判断就可以解决掉这个问题

Android数据库源码分析(2)-SQLiteDatabase的实现以及多线程行为

a 夏天 提交于 2020-01-22 03:02:20
Android数据库源码分析(2)-SQLiteDatabase的实现以及多线程行为 本系列主要关注安卓数据库的线程行为,分为四个部分: (1)SQLiteOpenHelper的getReadableDatabase和getWritableDatabase (2)SQLiteDatabase的实现以及多线程行为 (3)连接缓存池SQLiteConnectionPool (4)SQLiteDatabase多线程实践 本篇主要关注 SQLiteDatabase 的线程同步实现与架构实现。 1 SQLiteClosable的acquireReference与releaseReference方法 SQLiteClosable 是 SQLiteDatabase 的父类,也同时是数据库下其他几个类的父类。其中实现了引用计数逻辑来控制资源释放的时机。 private int mReferenceCount = 1; public void acquireReference() { synchronized(this) { if (mReferenceCount <= 0) { throw new IllegalStateException( "attempt to re-open an already-closed object: " + this); } mReferenceCount++;

编译Spark源码,hadoop.version=2.6.0-cdh5.16.2

不问归期 提交于 2020-01-22 01:38:11
1>到官网上下载Spark源代码 2>进入到该目录下 3>修改该目录下的pom.xml,新增如下代码 <repository> <id>cloudera</id> <name>cloudera Repository</name> <url>https://repository.cloudera.com/artifactory/cloudera-repos</url> </repository> 4>编译代码 ./dev/make-distribution.sh --name 2.6.0-cdh5.16.2 --tgz -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.16.2 -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes 5>等待一段时间,第一次编译速度较慢,会在网上下载所需资源 6>解压即可 来源: CSDN 作者: 应龙与巨蜥 链接: https://blog.csdn.net/weixin_42209440/article/details/104060684

Virtualbox源码分析8: VM manager

℡╲_俬逩灬. 提交于 2020-01-22 00:19:56
·Virtualbox源码分析8: VM manager VMM的代码里,处理VT-X虚拟化框架之外,还有各种Manager,从vmR3InitRing3()这个函数里,可以看到所有manager的初始化函数 /** * Initializes all R3 components of the VM */ static int vmR3InitRing3 ( PVM pVM , PUVM pUVM ) { //对每个VCPU向R0注册Emulate thread for ( VMCPUID idCpu = 1 ; idCpu < pVM - > cCpus ; idCpu ++ ) { rc = VMR3ReqCallWait ( pVM , idCpu , ( PFNRT ) vmR3RegisterEMT , 2 , pVM , idCpu ) ; } //NEM: hyper-v模式下的native execution manager rc = NEMR3InitConfig ( pVM ) ; //Memory Manager. rc = MMR3Init ( pVM ) ; // CPU Monitor / Manager. rc = CPUMR3Init ( pVM ) ; rc = NEMR3InitAfterCPUM ( pVM ) ; // Page

ArrayList实现原理分析

牧云@^-^@ 提交于 2020-01-22 00:15:17
ArrayList使用的存储的数据结构 ArrayList的初始化 ArrayList是如何动态增长 ArrayList如何实现元素的移除 ArrayList小结 ArrayList是我们经常使用的一个数据结构,我们通常把其用作一个可变长度的动态数组使用,大部分时候,可以替代数组的作用,我们不用事先设定ArrayList的长度,只需要往里不断添加元素即可,ArrayList会动态增加容量。ArrayList是作为List接口的一个实现。 那么ArrayList背后使用的数据结构是什么呢? ArrayList是如何保证动态增加容量,使得能够正确添加元素的呢? 要回答上面的问题,我们就需要对ArrayList的源码进行一番分析,深入了解其实现原理的话,我们就自然能够解答上述问题。 需要说明的是,本文所分析的源码引用自JDK 8版本 ArrayList使用的存储的数据结构 从源码中我们可以发现,ArrayList使用的存储的数据结构是Object的对象数组。 其实这也不能想象,我们知道ArrayList是支持随机存取的类似于数组,所以自然不可能是链表结构。 /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the

SpringMVC源码阅读RequestMappingHandlerAdapter如何处理Handle(八)

十年热恋 提交于 2020-01-21 18:31:31
接口 public interface HandlerAdapter { /** * 是否能处理指定Handler * @param var1 * @return */ boolean supports(Object var1); /** * 处理Handler * @param var1 * @param var2 * @param var3 * @return * @throws Exception */ @Nullable ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception; /** * 获取资源最后一次更新时间 * @param var1 * @param var2 * @return */ long getLastModified(HttpServletRequest var1, Object var2); } 类图 我们回到Dispatcher开始看起 DispatcherServlet doDispatch org.springframework.web.servlet.FrameworkServlet#service -> org.springframework.web.servlet.FrameworkServlet

Spring IoC - Spring IoC 的设计

╄→尐↘猪︶ㄣ 提交于 2020-01-21 17:11:47
前言 本文为解读Spring IoC 模块源码的开篇介绍。介绍Spring IoC 的相关概念与设计。 What is IoC 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递(注入)给它。 – 摘自维基百科 大型应用中,需要多个类组合工作来实现业务逻辑。这使得每个对象都需要在工作的时候获取到与其合作的对象的引用。 如果这个获取过程要靠自身来实现,那么,代码会变得高度耦合并且难以测试。这对复杂的OOP系统的设计是非常不利的。 在OOP系统中,对象封装了数据和对数据的处理动作,对象的依赖关系体现在了对数据和方法的依赖上。这些依赖关系,可以通过把对象的依赖注入交给框架或IoC容器来完成。 简单来说: 控制:当前对象对其内部成员对象的控制权/获取组装对象的过程 反转:上述的过程/控制权,交由专门的第三方组件(容器或者说平台)来管理 这种从具体对象手中,交出控制的做法,在解耦代码的同时提高了代码的可测试性。好处具体如下: 不用自己组装,拿来就用。 享受单例的好处

Spring IoC - 依赖注入源码解析

百般思念 提交于 2020-01-21 16:20:29
前言 上一篇文章中,我们介绍了Spring IoC 的容器初始化过程 - IoC 容器初始化 本篇文章中,我们继续介绍Spring IoC 依赖注入的过程和源码解读。 还是如之前一样,为大家梳理一下步骤流程,以便于大家能在心里有个大概的脉络,更容易读懂源码,更容易抓住重点。 主要内容: beanName 解析转换 手动注册Bean检测 双亲容器检测 依赖初始化(递归) ★ 创建singleton 实例 对象实例化 属性装配 处理Bean创建之后的各种回调事件 … 源码解析 上一章最后一节,容器初始化的倒数第二步, finishBeanFactoryInitialization(beanFactory) 实例化所有单例,调用了 getBean() 方法来做singleton bean 的实例化操作。这就是Spring IoC 依赖注入的入口。 在开始之前,有一点需要提一下。前面我们是从容器初始化之后进来的,但实际操作中,我们有可能是在程序普通运行情况下,用 ApplicationContext.getBean() 去获取容器中bean。不要局限于刚刚的视角中。 现在让我们开始吧。 首先看看 getBean() 源码位置: AbstractBeanFactory#getBean(String name) @Override public Object getBean ( String

How it works(14) GDAL2Tiles源码阅读

帅比萌擦擦* 提交于 2020-01-21 15:42:15
引入 gdal2tiles(以下简称g2t),这个历史悠久的切图脚本依然能发挥其功用,因为它稳定的做好了它应做的东西.相比前面说过的gdal2mbtiles(以下简称g2m),我倒是更喜欢它,单文件脚本,运行只安装一个GDAL库足矣.同样因为有了g2m,我也是带着对比的心态提出几个问题: 从表现来看,g2t更慢 慢的原因是什么 可以采用g2m加速吗 与g2m对比,其算法有何差异 精简 原始的g2t脚本近3000行,包含了详细的注释和一些其他的功能,分析起来会产生干扰,因此我精简掉全部注释和我所用不上的功能,保留了核心功能,方便分析和使用. 相比原来精简掉的内容: 与KML输出相关的功能和变量 与生成HTML脚本相关的功能和变量 只保留了生成web墨卡托投影瓦片的功能 只保留了"average"一种重采样算法 限定只能生成png格式的瓦片 相比原来修改的内容: 将相关的功能整合进类中 修改命名规范为小驼峰 以下是修改后的脚本,不到500行,下面就基于这个修改后的核心脚本进行分析 from xml . etree import ElementTree import json from osgeo import gdal , osr from uuid import uuid4 import sys import shutil import tempfile import os

探索vue源码之缓存篇

故事扮演 提交于 2020-01-21 08:28:01
探索vue源码之缓存篇 一、从链表说起 首先我们来看一下 链表 的定义: 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer) 其中的双向链表是我们今天的主角: 双向链表 也叫 双链表 。双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针。这样可以从任何一个节点访问前一个节点,当然也可以访问后一个节点,以至整个链表。一般是在需要大批量的另外储存数据在链表中的位置的时候用。 图示如下(图片来自 维基百科-链表 ): 想象一群人手拉手站成一排,除了队头跟队尾,可以根据每个人的左手以及右手找到排在其左边或者右边的人,这也可以看成一种双向链表 在 JavaScript 中,我们可以通过对象的属性来实现双向链表。 而在 vue.js 中,作者正是利用类似双向链表的方式实现缓存的利用 二、LRU算法 在缓存中,利用类似双向链表来管理缓存并不难的。难的是如何更加高效的管理缓存,如何在缓存达到其最大内存空间,删除程序中最不常用的变量,而不是随机删除,造成最常用的变量被误删的情况。 vue.js 中采用 LRU算法 来实现缓存的高效管理。 LRU 是 Least Recently Used 的简称,具体内容可以查看 GitHub ,其有以下优点: 基于双向链表改变缓存对象中