源码

线程池源码阅读(一)

谁说我不能喝 提交于 2020-02-05 04:30:34
线程池源码阅读(一) 仅大致过了下,有问题的请指出,谢谢。 版本 1.8 类关系 1. Executors 提供创建 ThreadPoolExecutor 类的快速方法。 建议:不要使用 Executors 类创建 ThreadPoolExecutor newFixedThreadPool newSingleThreadExecutor newCachedThreadPool newScheduledThreadPool public static ExecutorService newFixedThreadPool ( int nThreads ) { return new ThreadPoolExecutor ( nThreads , nThreads , 0 L , TimeUnit . MILLISECONDS , new LinkedBlockingQueue < Runnable > ( ) ) ; } public static ExecutorService newFixedThreadPool ( int nThreads , ThreadFactory threadFactory ) { return new ThreadPoolExecutor ( nThreads , nThreads , 0 L , TimeUnit . MILLISECONDS ,

vue源码学习之组件挂载

∥☆過路亽.° 提交于 2020-02-05 04:22:40
Vue.prototype.$mount方法扩展 解析 template/el 并生成render函数,最后调用一下公共的mount方法 //文件位置:/src/platforms/web/entry-runtime-with-compiler.js const mount = Vue.prototype.$mount Vue.prototype.$mount = function ( el?: string | Element, hydrating?: boolean ): Component { el = el && query(el) const options = this.$options // 解析 template/el 并生成render函数 if (!options.render) { let template = options.template if (template) { if (typeof template === 'string') { if (template.charAt(0) === '#') { template = idToTemplate(template) } } else if (template.nodeType) { template = template.innerHTML } else { return this } }

深入理解 Netty-新连接接入

China☆狼群 提交于 2020-02-05 02:31:59
什么是新连接接入?以及新连接接入前,Netty处于什么状态 netty的服务端 NioServerSocketChannel 初始化,注册在BossGroup中的一条 NioEventLoop 中,并且给 NioServerSocketChannel 中维护的jdk原生的 ServerSocketChannel 绑定好了端口后, EventLoop启动,开始轮询工作... 这时候 EventLoop 它在轮询什么? 其实它在轮询监听当初NioServerSocketChannel经过二次注册感兴趣的事件时, 告诉 Selector,让Selector关注自己身上可能会出现 OP_ACCEPT 事件, 这合情合理,因为对于Netty的主从Reactor线程模型中, BossGroup中的channel只关心 OP_ACCEPT 也就是用户的请求建立连接事件 netty的新连接接入要做哪些工作? 看上图,netty的新连接接入,对应这个线程模型中我圈出来的部分, 主要步骤如下 服务端Selector轮询到客户端请求建立连接 处理请求 从服务端维护的JDK 原生ServerSocketChannel中accept()客户端的channel 使用new的方法 将客户端的Channel封装成 NioSocketChannel 层层往上调用super(),初始化channel的组件

Netty服务端的启动源码分析

∥☆過路亽.° 提交于 2020-02-05 02:29:46
ServerBootstrap的构造: 1 public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel> { 2 private static final InternalLogger logger = InternalLoggerFactory.getInstance(ServerBootstrap.class); 3 private final Map<ChannelOption<?>, Object> childOptions = new LinkedHashMap(); 4 private final Map<AttributeKey<?>, Object> childAttrs = new LinkedHashMap(); 5 private final ServerBootstrapConfig config = new ServerBootstrapConfig(this); 6 private volatile EventLoopGroup childGroup; 7 private volatile ChannelHandler childHandler; 8 9 public ServerBootstrap() { 10 } 11 ...... 12

mybatis源码分析(3)——SqlSessionManager类

别等时光非礼了梦想. 提交于 2020-02-05 02:20:39
从上图可能看出,在 mybatis 中, SqlSession 的实现类有两个,其中 SqlSessionManager 类不但实现了 SqlSession 接口,同时也实现了 SqlSessionFactory 接口。那么 SqlSessionManager 类究竟有何作用 ? 由于源码中缺少注释,所以从 mybatis 目前的提供官方文档来看,似乎该类已被弃用,其功能被 DefaultSqlSession 类和 DefaultSqlSessionFactory 类所代替。只是该类的部分代码对我们理解 mybatis 的一些底层机制还具有一定的参考价值,例如: SqlSessionManager的下面的构造方法,会产生一个SqlSession 的一个代理对象: private SqlSessionManager(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; this.sqlSessionProxy = (SqlSession) Proxy.newProxyInstance( SqlSessionFactory.class.getClassLoader(), new Class[]{SqlSession.class}, new

keepalived源码解析 —— parser.c

不问归期 提交于 2020-02-05 00:39:11
1、strspn 与 strcspn: size_t strspn(const char *str1, const char *str2):查找 str1 中第一个不出现在 str2 的字符的下标。 size_t strcspn(const char *s, const char * reject):从字符串 s 的第一个字符开始,计算连续多少个字符不在 reject 所指的字符串中。返回值:连续字符的个数 2、strdup 与 strndupa: char *strdup(const char *s):返回一个指向 s 副本的指针,这个副本内存是由 malloc 分配,使用完之后,需要使用 free() 释放内存。 char *strndupa(const char *s, size_t n):与 strdup() 类似,但是最多拷贝 n 个字节,若 s 的长度大于 n,则复制 n 个字节,并在末尾添加 ‘\0’ 3、void memmove( void dest, const void* src, size_t count ): 拷贝字节 若目标区域与源区域没有重叠,则和memcpy函数功能相同 若目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。 4、int glob(const char

【Java】NIO中Selector的创建源码分析

百般思念 提交于 2020-02-04 23:50:27
在使用Selector时首先需要通过静态方法open创建Selector对象 1 public static Selector open() throws IOException { 2 return SelectorProvider.provider().openSelector(); 3 } 可以看到首先是调用SelectorProvider的静态方法provider,得到一个Selector的提供者 1 public static SelectorProvider provider() { 2 synchronized (lock) { 3 if (provider != null) 4 return provider; 5 return AccessController.doPrivileged( 6 new PrivilegedAction<SelectorProvider>() { 7 public SelectorProvider run() { 8 if (loadProviderFromProperty()) 9 return provider; 10 if (loadProviderAsService()) 11 return provider; 12 provider = sun.nio.ch.DefaultSelectorProvider.create();

Activiti流程定义缓存源码分析3-activiti缓存处理类

China☆狼群 提交于 2020-02-04 23:36:15
DefaultDeploymentCache类作为默认的缓存处理类,该类的核心代码如代码清单x-所示。 代码清单x-DefaultDeploymentCache.java --------------------------------------------------------------------------------------------------------------------------- protected Map<String, T> cache;//该集合最终存储所有需要缓存的对象 public DefaultDeploymentCache() { this(-1);//调用有参构造函数传入参数默认值为-1 } public DefaultDeploymentCache(final int limit) { #-1 if (limit > 0) {//判断limit参数值 this.cache = Collections.synchronizedMap(new LinkedHashMap <String, T>(limit + 1, 0.75f, true) { #-2 protected boolean removeEldestEntry(Map.Entry<String, T> eldest) { #-3 boolean removeEldest

如何阅读源代码

北城以北 提交于 2020-02-04 22:34:20
从网上看到别人总结的如何阅读源代码,感觉很有道理,记下来,以备不时只需 开源项目已阅读了不少,总结下来按照下面的steps来操作比较恰当: 1)阅读features。以此来搞清楚该项目有哪些特性 2)思考。想想如果自己来做有这些features的项目该如何构架 3)下载并安装demo或sample。通过demo或sample直观地感受这个项目 4)搜集能得到的doc,尽快地掌握如何使用这个项目 5)如果有介绍项目架构的文档,通过它了解项目的总体架构,如果没有,通过api-doc了解源码包的结构 6) 分两遍来阅读源码。第一遍以应用为线索,以总体结构为基础,阅读在应用中使用到的类和方法,但不用过深挖掘细节,对于嵌套调用,只用通过函数名了解最上层 函数的意义,这一遍的目的在于把大致结构了然于心。第二遍就是阅读类和方法的实现细节,以第一遍的阅读为基础,带着疑问去阅读那些自己难以实现的模块。 7)总结。回味这个项目设计上的精妙,用到了哪些设计模式,能在哪些领域可以借鉴等等。 总结: 从一个接口的使用方法入手,例如DI。先从网上找到其基本原理的文章,理解之后,找到生成实例的类的代码,然后一步步向下推。看到不认识的类就查查API看是干什么用的。 首先要搞清它大体的处理步骤,然后再去详细看每个类的具体内容。 读代码,最忌从一开始就企图详细理解一个大工程的所有细节。 先看大匡

如何熟悉一个项目?

拥有回忆 提交于 2020-02-04 21:21:45
如何熟悉一个开源项目? Posted on 2012-05-22 23:12 dennis 阅读(20745) 评论(9) 编辑 收藏 所属分类: 模式与架构 、 源码解读 你有个任务,需要用到某个开源项目;或者老大交代你一个事情,让你去了解某个东西。怎么下手呢?如何开始呢?我的习惯是这样: 1.首先,查找和阅读该项目的博客和资料,通过google你能找到某个项目大体介绍的博客,快速阅读一下就能对项目的目的、功能、基本使用有个大概的了解。 2.阅读项目的文档,重点关注类似 Getting started、Example 之类的文档,从中学习如何下载、安装、甚至基本使用该项目所需要的知识。 3.如果该项目有提供现成的example工程,首先尝试按照开始文档的介绍运行example,如果运行顺利,那么恭喜你顺利开了个好头;如果遇到问题,首先尝试在项目的 FAQ 等文档里查找答案,再次,可以将问题(例如异常信息)当成关键词去搜索,查找相关的解决办法,你遇到了,别人一般也会遇到,热心的朋友会记录下解决的过程;最后,可以将问题提交到项目的邮件列表,请大家帮你看看。 在没有成功运行example之前,不要尝试修改example。 4.运行了第一个example之后,尝试根据你的理解和需要修改example,测试高级功能等。 5.在了解基本使用后,需要开始深入的了解该项目。例如项目的配置管理