源码

logback源码阅读-获取Logger(二)

不羁的心 提交于 2020-04-08 13:41:26
类图 前面代码看出来 最终返回的是LoggerContext这个类实现了LogFactory 成员变量 //表示根logger final Logger root = new Logger("ROOT", (Logger)null, this); //标识创建了多少个logger private int size; //未知 private int noAppenderWarning = 0; //<1>接口的实例能监听 logger context 上发生的事件,比如说日志级别的变化 private final List<LoggerContextListener> loggerContextListenerList = new ArrayList(); //logger缓存 get一次会存入缓存同时size++下次直接从缓存拿 private Map<String, Logger> loggerCache = new ConcurrentHashMap(); //loggerContextVO对象 private LoggerContextVO loggerContextRemoteView = new LoggerContextVO(this); private final TurboFilterList turboFilterList = new

Kubernetes1.1源码分析(二)

穿精又带淫゛_ 提交于 2020-04-08 13:35:26
3、controller-manager模块 在controller manager模块中有几个重要的结构体。当中包含EndpointController、ReplicationManager、GCController、NodeController、ServiceController、RouteController、ResourceQuotaController,以下会进行介绍。在controller manager模块还有几个处于试验阶段的功能和结构体,这里不会进行介绍。 3.1、EndpointController EndpointController是个入口控制器结构体,表示一组包含服务的Pods副本。里面有POD入口控制器podController变量和Service入口控制器serviceController变量,里面还有POD存储变量podStore和Service存储变量serviceStore。EndpointController结构体中还有queue变量和client变量。 type EndpointController struct { client *client.Client serviceStore cache.StoreToServiceLister podStore cache.StoreToPodLister queue *workqueue

[转帖]JVM源码分析之安全点safepoint

懵懂的女人 提交于 2020-04-08 08:52:36
JVM源码分析之安全点safepoint https://www.jianshu.com/p/c79c5e02ebe6 原来是这个意思.. 简书 占小狼 转载请注明原创出处,谢谢! 上周有幸参加了一次关于JVM的小范围分享会,听完R大对虚拟机C2编译器的讲解,我的膝盖一直是肿的,能记住的实在有点少,能听进去也不多 1、什么时候进行C2编译,如何进行C2编译(这个实在太复杂) 2、C2编译的时候,是对整个方法体进行编译,而不是某个方法段 3、JVM中的safepoint 一直都知道,当发生GC时,正在执行Java code的线程必须全部停下来,才可以进行垃圾回收,这就是熟悉的STW(stop the world),但是STW的背后实现原理,比如这些线程如何暂停、又如何恢复?就比较疑惑了。 然而这一切的一切,都涉及到一个概念safepoint,openjdk的实现位于 openjdk/hotspot/src/share/vm/runtime/safepoint.cpp 什么是safepoint safepoint可以用在不同地方,比如GC、Deoptimization,在Hotspot VM中,GC safepoint比较常见,需要一个数据结构记录每个线程的调用栈、寄存器等一些重要的数据区域里什么地方包含了GC管理的指针。 从线程角度看

Java HashMap源码详解

夙愿已清 提交于 2020-04-08 01:30:17
Java数据结构-HashMap 目录 Java数据结构-HashMap 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 1.1.2 HashMap继承图 1.2 HashMap 组成结构 1.2.1 Hashmap底层数据结构 2.HashMap源码解析 2.1 HashMap属性源码解析 2.1.1 HashMap中的静态常量 2.1.2 HashMap中的属性 2.1.2 HashMap中的存储结点 2.1.3 Hash表 2.2 方法源码分析 2.2.1 构造方法分析 2.2.2 Put(K key,V value) 待续... 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做 Entry ,有着key与value两个基本属性以及有其他的包含其他结点位置信息的属性 通过HashMap我们可以存储键值对,并且可以在较短的时间复杂度内, 1.1.2 HashMap继承图 HashMap通过继承 AbstractMap 实现了 Map 接口,且本身也实现了 Map 接口 在接口实现关系上来看为多余操作 但有一点要注意,在使用 反射获取实现接口 时,如果不是显示实现某接口而是通过继承来实现该接口,则不会获取该接口类型,这一点在使用

Spring如何解决循环依赖,你真的懂了?

对着背影说爱祢 提交于 2020-04-07 20:58:08
导读 前几天发表的文章 SpringBoot多数据源动态切换 和 SpringBoot整合多数据源的巨坑 中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构造器依赖,详情请看上面两篇文章,这里不再详细赘述了。本篇文章将会从源码深入解析Spring是如何解决循环依赖的?为什么不能解决构造器的循环依赖? 什么是循环依赖 简单的说就是A依赖B,B依赖C,C依赖A这样就构成了循环依赖。 循环依赖分为构造器依赖和属性依赖,众所周知的是Spring能够解决属性的循环依赖(set注入)。下文将从源码角度分析Spring是如何解决属性的循环依赖。 思路 如何解决循环依赖,Spring主要的思路就是依据三级缓存,在实例化A时调用doGetBean,发现A依赖的B的实例,此时调用doGetBean去实例B,实例化的B的时候发现又依赖A,如果不解决这个循环依赖的话此时的doGetBean将会无限循环下去,导致内存溢出,程序奔溃。spring引用了一个早期对象,并且把这个"早期引用"并将其注入到容器中,让B先完成实例化,此时A就获取B的引用,完成实例化。 三级缓存 Spring能够轻松的解决属性的循环依赖正式用到了三级缓存,在 AbstractBeanFactory 中有详细的注释。 /**一级缓存,用于存放完全初始化好的 bean,从该缓存中取出的

【PHP源码】PHP 函数调用

≡放荡痞女 提交于 2020-04-07 20:46:29
想法 我以前对于 C 语言的印象是有很强的确定性,而 PHP 在执行的时候会被翻译为 C 语言执行,所以一直很好奇 PHP 怎么调用底层函数。 换句话说就是已知函数名字的情况下如何调用 C 语言中对应名字的函数? 解决这个问题前,首先根据过往的经验做出假设,然后再去验证。 之前在写《用 C 语言实现面向对象》的时候,就意识到使用 void 指针实现很多功能,包括指向任意的函数。接着在写《PHP 数组底层实现》的时候,了解了 HashTable 的实现,即在 C 语言层面通过字符串 key 找到任意类型值。 现在把两者结合起来,是否就能解决以上问题了?比如说把函数名作为 HashTable 的 key,函数指针作为 HashTable 的 value,这样就可以通过函数名获取函数指针来调用函数了。 接下来通过查看 PHP 的源码来看这个假设与真实情况有多少差距。 总体分为三个步骤: 从 PHP 层进入 C 语言层 找到字符串函数名与函数的关系 函数的调用 注:这篇博客的源码对应的版本是 PHP 7.4.4 。 https://github.com/php/php-src/tree/php-7.4.4 从 PHP 层进入 C 语言层 首先要找到 C 语言层调用函数的地方。怎么找? 经常使用 PHP 的同学看到前面的问题描述很容易联想到 PHP

安装使用swoole

霸气de小男生 提交于 2020-04-07 13:23:57
swoole首页: https://www.swoole.com/ 方法1:使用pecl安装   pecl install swoole   注意,php版本必须是7.0以及7.0以上的版本。 方法2:编译源码安装 第一步:下载swoole的源码   下载源码的时候要注意,swoole2.0及以后版本不再支持PHP5.x git clone https://github.com/swoole/swoole-src.git 第二步:进入源码目录,执行phpize命令 第三步:配置php-config的路径 ./configure --with-php-config=/usr/local/php/bin/php-config 第四步:将php.ini中被禁止的proc_open、proc_get_status、system、exec、shell_exec这几个函数从其中删除,因为在make时要用到这几个函数。 第五步:make   注意:如果下载的swoole 2.x,而php版本低于7.0,在这一步会失败,请下载正确源码版本 第六步:make test 第七步检测是否安装成功 php -m 使用swoole搭建一个http服务器 <?php $http = new swoole_http_server("0.0.0.0",9501); $http->on("request",



tomcat源码阅读_代码篇4

我只是一个虾纸丫 提交于 2020-04-07 13:19:14
StandardServer类: 该类的签名如下: public final class StandardServer implements Lifecycle, Server, MBeanRegistration 该类实现了Lifecycle, Server, MBeanRegistration接口。 Lifecycle接口是Catalina的组件的通用声明周期方法的接口,组件可以选择实现该接口。该接口定义了声明周期统一启动停止机制。方法定义如下: void addLifecycleListener ( LifecycleListener listener) Add a LifecycleEvent listener to this component. LifecycleListener [] findLifecycleListeners () Get the lifecycle listeners associated with this lifecycle. void removeLifecycleListener ( LifecycleListener listener) Remove a LifecycleEvent listener from this component. void start () Prepare for the beginning of

Mybatis源码阅读之--Mapper执行流程

心不动则不痛 提交于 2020-04-07 11:52:27
Mybatis的主要操作流程为: 1.使用SqlSessionFactory创建SqlSession 2.利用SqlSession获取Mapper 3.使用获取到的Mapper执行相应的增删改查的操作 本文介绍其中的第二步SqlSession如何获取到Mapper。 首先我们会调用SqlSession的geMapper方法获取Mapper,而SqlSession默认的实现类为DefaultSqlSession,找到DefaultSqlSession的源码,getMapper方法如下: // DefaultSqlSession的getMapper方法 @Overridepublic <T> T getMapper(Class<T> type) { return configuration.getMapper(type, this); } 通过以上代码,得知是从configuration中获取Mapper,继续进入configuration的getMapper方法--Configuration是Mybatis的配置类,里面记录了很多Mybatis的配置属性,其中就包括这里讲到的MapperRegistry // Configuration的getMapper方法 public <T> T getMapper(Class<T> type, SqlSession sqlSession) {

阅读Qt Creator--PluginDialog 和 PluginView分析

旧城冷巷雨未停 提交于 2020-04-07 07:29:42
PluginView 是插件管理器中所管理插件的可视化的查看类,派生自 QWidget ,可以作为任何 QWidget 的子类的子窗口。 方法列表及说明: 成员方法 说明 PluginSpec *currentPlugin() const QTreeWidgetItem中的UserRole里存放着相应的PluginSpec, 在parsePluginSpecs()中可以看到 QIcon iconForState(int state) 根据state所指插件状态返回一个 Qi con ParsedNone = 1 , ParsedPartial = 2 , ParsedAll = 4 , ParsedWithErrors = 8 这四种状态,但有三种图标: ok , error , notloaded int parsePluginSpecs( QTreeWidgetItem *parentItem, Qt::CheckState &groupState, QList<PluginSpec*> plugins); @ return 指定插件组(插架有不同的分类比如专门解析C++的插架为一组,一种类型为一组)的状态。 @ parameters @ parentItem (in) 记录这一组的信息(这里只有插件组的名称,其他信息为空,仅仅为了属性空间留下其他空位) @groupState