源码

7. SOFAJRaft源码分析—如何实现一个轻量级的对象池?

回眸只為那壹抹淺笑 提交于 2019-12-05 12:22:09
前言 我在看SOFAJRaft的源码的时候看到了使用了对象池的技术,看了一下感觉要吃透的话还是要新开一篇文章来讲,内容也比较充实,大家也可以学到之后运用到实际的项目中去。 这里我使用RecyclableByteBufferList来作为讲解的例子: RecyclableByteBufferList public final class RecyclableByteBufferList extends ArrayList<ByteBuffer> implements Recyclable { private transient final Recyclers.Handle handle; private static final Recyclers<RecyclableByteBufferList> recyclers = new Recyclers<RecyclableByteBufferList>(512) { @Override protected RecyclableByteBufferList newObject(final Handle handle) { return new RecyclableByteBufferList( handle); } }; //获取一个RecyclableByteBufferList实例 public static

Flask源码之:路由加载

a 夏天 提交于 2019-12-05 12:20:56
路由加载整体思路: 1. 将 url = /index 和 methods = [GET,POST] 和 endpoint = "index"封装到Rule对象 2. 将Rule对象添加到 app.url_map中。 url_rule_class = Rule self.url_map = self.url_map_class() 3. 把endpoint和函数的对应关系放到 app.view_functions中。 self.view_functions = {} 在add_url_rule中有: self.view_functions[endpoint] = view_func 来源: https://www.cnblogs.com/shengjunqiye/p/11924832.html

MYBATIS源码分析之02配置文件解析

拟墨画扇 提交于 2019-12-05 12:19:28
上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的。 通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置 <cache eviction="LRU" type="qinfeng.zheng.RedisCache"/> MYBATIS源码分析之02配置文件解析 这篇文章讲解了mybatis解析配置文件具体的过程, 这里再总结一下,mybatis解析主配置文件使用了XMLConfigBuilder对象, 解析具体的Mapper接口配置则使用了XMLMapperBuilder对象,是不是很好记忆。。。 所以,要了解mybatis是如何是解析 <cache eviction="LRU" type="qinfeng.zheng.RedisCache"/> 这行代码 ,肯定得去XMLMapperBuilder这个类了, 具体看XMLMapperBuilder#configurationElement(XNode context)方法。 很明显,具体的实现在cacheElement()方法中, 结合debug看一下 接着我们可以再深究一下builderAssistant是如何创建这个缓存的。 public Cache useNewCache(Class<? extends Cache> typeClass,

Flask源码之:配置加载

你说的曾经没有我的故事 提交于 2019-12-05 12:16:43
加载配置文件的思路: 1. 读取配置文件中的所有键值对,并将键值对全都放到Config对象。(Config是一个字典,因为它继承了Dict) 2. 把包含所有配置文件的Config对象,赋值给 app.config,然后可以用app.config去调用配置。 app.config.from_object('xx.xx' )用来加载xx.xx配置文件中的配置 项目启动: from flask import Flask app = Flask(__name__,static_url_path='/xx') # app.config = Config对象 # Config对象.from_object('xx.xx') # app.config app.config.from_object('xx.xx') @app.route('/index') def index(): return 'hello world' if __name__ == '__main__': app.run() 来源: https://www.cnblogs.com/shengjunqiye/p/11924581.html

flask源码系列

别来无恙 提交于 2019-12-05 12:13:21
HTML文档中元素存在,但是在浏览器中不显示。一般用于配合JavaScript代码使用。 - 04 LocalStack和Local对象实现栈的管理 - 05 Flask源码之:配置加载 - 06 Flask源码之:路由加载 来源: https://www.cnblogs.com/strawberry-1/p/11924241.html

源码分析RocketMQ消息轨迹

北慕城南 提交于 2019-12-05 12:04:13
目录 1、发送消息轨迹流程 1.1 DefaultMQProducer构造函数 1.2 SendMessageTraceHookImpl钩子函数 1.3 TraceDispatcher实现原理 2、 消息轨迹数据如何存储 2.1 使用系统默认的主题名称 2.2 用户自定义消息轨迹主题 本文沿着 《RocketMQ消息轨迹-设计篇》 的思路,从如下3个方面对其源码进行解读: 发送消息轨迹 消息轨迹格式 存储消息轨迹数据 @(本节目录) 1、发送消息轨迹流程 首先我们来看一下在消息发送端如何启用消息轨迹,示例代码如下: public class TraceProducer { public static void main(String[] args) throws MQClientException, InterruptedException { DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName",true); // @1 producer.setNamesrvAddr("127.0.0.1:9876"); producer.start(); for (int i = 0; i < 10; i++) try { { Message msg = new Message("TopicTest",

深入浅出的分析 Set集合

旧街凉风 提交于 2019-12-05 11:32:26
01. 摘要 Set集合的特点主要有:元素不重复、存储无序的特点。 打开 Set 集合,主要实现类有 HashSet、LinkedHashSet 、TreeSet 、EnumSet( RegularEnumSet、JumboEnumSet )等等,总结 Set 接口实现类,图如下: 由图中的继承关系,可以知道,Set 接口主要实现类有 AbstractSet、HashSet、LinkedHashSet 、TreeSet 、EnumSet( RegularEnumSet、JumboEnumSet ),其中 AbstractSet、EnumSet 属于抽象类,EnumSet 是在 jdk1.5 中新增的,不同的是 EnumSet 集合元素必须是枚举类型。 HashSet 是一个输入输出无序的集合,集合中的元素基于 HashMap 的 key 实现,元素不可重复; LinkedHashSet 是一个输入输出有序的集合,集合中的元素基于 LinkedHashMap 的 key 实现,元素也不可重复; TreeSet 是一个排序的集合,集合中的元素基于 TreeMap 的 key 实现,同样元素不可重复; EnumSet 是一个与枚举类型一起使用的专用 Set 集合,其中 RegularEnumSet 和 JumboEnumSet 不能单独实例化,只能由 EnumSet 来生成

jdk1.6集合源码阅读之LinkedList

微笑、不失礼 提交于 2019-12-05 11:30:21
如果说ArrayList是基于数组实现的List,那么LinkedList是基于链表实现的List。 1.定义 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable 可以看得到LinkedList继承了AbstractSequentialList。实现了List,Deque. 后面两个和ArrayList一样,说明可以被克隆和序列化。 而AbstractSequentialList基础自AbstractList,而且还重新实现了get,set,add,remove,等等方法。 AbstractSequentialList的代码如下: package java.util; public abstract class AbstractSequentialList<E> extends AbstractList<E> { protected AbstractSequentialList() { } public E get(int index) { try { return listIterator(index).next(); } catch (NoSuchElementException exc

java源码 -- AbstractList

倾然丶 夕夏残阳落幕 提交于 2019-12-05 11:24:06
AbstractList    AbstractList是实现List接口的抽象类 ,AbstractList抽象类与List接口的关系类似于AbstractCollection抽象类与Collection接口的关系。   AbstractList与AbstractCollection一样,也是通过提供一些方法的默认实现,简化我们编写List接口的列表类所需付出的努力。 实现列表类的需要记住:   1)要想实现一个不可修改的集合,只需要继承这个类,并且实现get(int)、size()方法;   2)要想实现一个可以修改的集合,还必须重写set(int, E)方法,该方法默认抛出一个异常。如果集合是可动态调整大小的,还必须重写add(int, E),remove(int)方法。 方法   public boolean add(E e){} public boolean add(E e) { add(size(), e); //通过调用add(int, E)方法进行添加 return true; } //以下方法没有具体的实现,调用它时,抛出异常。 public void add (int index, E element){ throw new UnsupportedOperationException (); } public E set (int index, E