源码

Java容器系列-HashMap源码分析

人走茶凉 提交于 2020-01-14 17:57:11
HashMap 实现了 Map 接口。HashMap 使用的很广泛,但不是线程安全的,如果在多线程中使用,必须需要额外提供同步机制(多线程情况下推荐使用 ConCurrentHashMap)。 HashMap 的类图相对简单,主要就是继承了 AbstractMap,有一点需要注意,虽然没有实现 Iterable 接口,但 HashMap 本身还是实现了迭代器的功能。 本文基于 JDK1.8 成员变量及常量 HashMap 是一个 Node[] 数组,每一个下标称之为一个 桶 。 每一个键值对都是使用 Node 来存储,这是一个单链表的数据结构。每个桶上可以通过链表来存储多个键值对。 常量 HashMap 中用到的常量及其意义如下: // 初始容量(桶的个数) 2^4 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量(桶的个数) 2^30static final int MAXIMUM_CAPACITY = 1 << 30;// 默认的装载因子(load factor),除非特殊原因,否则不建议修改static final float DEFAULT_LOAD_FACTOR = 0.75f;// 单个桶上的元素个数大于这个值从链表转成树(树化操作)static final int TREEIFY_THRESHOLD

ConcurrentHashMap源码解析 JDK8

*爱你&永不变心* 提交于 2020-01-14 17:33:54
一、简介 上篇文章 详细介绍了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也没有引入红黑树

从源码角度来看BeanFactory和ApplicationContext的关系

走远了吗. 提交于 2020-01-14 14:08:56
大家好,我是小黑,这是年前的最后一篇推文,提前祝大家新年快乐~~ 这次我们从源码角度来聊聊 BeanFactory 和 ApplicationContext 的关系,讲一些网上文章不曾提到的点。 官方描述 先来看一下官方文档中关于 BeanFactory 和 ApplicationContext 的描述。 The org.springframework.beans and org.springframework.context packages are the basis for Spring Framework’s IoC container. The BeanFactory interface provides an advanced configuration mechanism capable of managing any type of object. ApplicationContext is a sub-interface of BeanFactory . It adds: Easier integration with Spring’s AOP features Message resource handling (for use in internationalization) Event publication Application-layer

HDFS源码分析之DataXceiverServer

≯℡__Kan透↙ 提交于 2020-01-14 13:42:22
DataXceiverServer是 Hadoop 分布式文件系统HDFS的从节点--数据节点DataNode上的一个后台工作线程,它类似于一个小型的服务器,被用来接收数据读写请求,并为每个请求创建一个工作线程以进行请求的响应。那么,有以下几个问题: 1、DataXceiverServer是什么? 2、DataXceiverServer是如何初始化的? 3、DataXceiverServer是如何工作的? 带着这些问题,本文将带着你进入DataNode的DataXceiverServer世界。 一、DataXceiverServer是什么? DataXceiverServer是数据节点DataNode上一个用于接收数据读写请求的后台工作线程,为每个数据读写请求创建一个单独的线程去处理。它的成员变量如下: [java] view plain copy // PeerServer是一个接口,实现了它的TcpPeerServer封装饿了一个ServerSocket,提供了Java Socket服务端的功能 private final PeerServer peerServer; // 该DataXceiverServer所属DataNode实例datanode private final DataNode datanode; // Peer所在线程的映射集合peers private

Redis源码剖析和注释(十二)--- 集合类型键实现(t_set)

自古美人都是妖i 提交于 2020-01-14 12:16:50
Redis 集合类型键实现(t_set) 集合命令介绍 redis中所有的集合命令如下:Redis集合命令详解 集合类型的实现 之前在redis对象系统源码剖析和注释中提到,一个集合类型的对象的编码有两种,分别是 OBJ_ENCODING_HT和OBJ_ENCODING_INTSET 。 关于集合类型底层的两种数据结构的源码剖析和注释,请看下面的博文。 Redis 字典结构源码剖析和注释 Redis 整数集合源码剖析和注释 从OBJ_ENCODING_INTSET转换到OBJ_ENCODING_HT的条件如下: redis的配置文件中的选项:如果数据编码为整数集合的集合对象的元素数量超过 set-max-intset-entries 阈值,则会转换编码 set - max - intset - entries 512 如果向数据编码为整数集合的集合对象插入字符串类型的对象,则会转换编码 集合对象的数据编码转换的源码如下: // 将集合对象的INTSET编码类型转换为enc类型 void setTypeConvert ( robj * setobj , int enc ) { setTypeIterator * si ; serverAssertWithInfo ( NULL , setobj , setobj -> type == OBJ_SET && setobj ->

Quartz源码解析 - JobExecutionContext、TriggerKey、JobDetail

怎甘沉沦 提交于 2020-01-14 09:17:45
目录 一. JobExecutionContext 二. TriggerKey 三. JobDetail 一. JobExecutionContext /** * 一个包含着大量环境信息的处理的上下文簇,当JobDetail被执行的时候,这个上下文传递给JobDetail, * 并且在执行完成的时候传递给Trigger实例 * * JobExecutionContext也是由Scheduler.getCurrentlyExecutionJobs()方法返回的。 * */ public interface JobExecutionContext { /** * 获取调度器 */ public Scheduler getScheduler(); /** * 获取触发器 */ public Trigger getTrigger(); /** * 获取由Trigger引用的Calendar */ public Calendar getCalendar(); /** * 如果工作因为恢复而重新执行,这个方法返回true */ public boolean isRecovering(); public TriggerKey getRecoveringTriggerKey() throws IllegalStateException; public int getRefireCount();

Virtualbox源码分析5:VMM虚拟化实现源码分析2

左心房为你撑大大i 提交于 2020-01-14 09:16:11
Virtualbox源码分析5:VMM虚拟化实现源码分析2 4.2 VMX R0部分代码 4.2.1 VMX初始化代码 R0 VMM初始化入口在HMR0.cpp里的HMR0Init() VMMR0_INT_DECL ( int ) HMR0Init ( void ) { uint32_t fCaps = 0 ; int rc = SUPR0GetVTSupport ( & fCaps ) ; if ( RT_SUCCESS ( rc ) ) { if ( fCaps & SUPVTCAPS_VT_X ) { rc = hmR0InitIntel ( ) ; if ( RT_FAILURE ( rc ) ) return rc ; } else { Assert ( fCaps & SUPVTCAPS_AMD_V ) ; rc = hmR0InitAmd ( ) ; if ( RT_FAILURE ( rc ) ) return rc ; } } rc = RTMpNotificationRegister ( hmR0MpEventCallback , NULL ) ; AssertRC ( rc ) ; rc = RTPowerNotificationRegister ( hmR0PowerCallback , NULL ) ; AssertRC ( rc ) ; }

MyBatis中的日志模块源码分析

三世轮回 提交于 2020-01-14 08:58:41
MyBatis中的日志模块源码分析 概览 MyBatis源码依赖的开源日志组件有: < dependency > < groupId > org.slf4j </ groupId > < artifactId > slf4j-api </ artifactId > < version > 1.7.30 </ version > < optional > true </ optional > </ dependency > < dependency > < groupId > org.slf4j </ groupId > < artifactId > slf4j-log4j12 </ artifactId > < version > 1.7.30 </ version > < optional > true </ optional > </ dependency > < dependency > < groupId > log4j </ groupId > < artifactId > log4j </ artifactId > < version > 1.2.17 </ version > < optional > true </ optional > </ dependency > < dependency > < groupId > org.apache.logging

Spring源码学习笔记

非 Y 不嫁゛ 提交于 2020-01-14 07:20:55
spring bean实例化简图 更改allowcircularReference为false可以关闭循环依赖,方式有三种。 1、更改spring源码 2、不要使用带参构造函数 改为 3、拓展spring(具体不知道怎么做,应该是通过BeanPostProcessor接口) 1、Spring IOC 笔记: 1、重要的区别,别搞混了 Instantiation 实例化 Initialization 初始化 1、在填充bean属性时,会调用一系列的BeanPostProcessor,其中CommonAnnotationBeanPostProcessor处理@Resource注解,AutowiredAnnotationBeanPostProcessor处理@Autowired注解,他们是解决循环依赖的关键。 2、代理是在 初始化后 调用postprocessor完成的。解决依赖过程中,从二级缓存工厂获取对象的时候,获取到的是 原对象的引用 ,再完成属性注入,再初始化。 3、初始化过程是先处理注解再处理类方法最后再处理注解。所以如果bean同时使用三种初始化方法,@PostConstruct注解的初始化方法先执行(先执行BeanPostProcessor接口,相关BeanPostProcessor接口实现类会处理注解)

workerman源码分析之启动过程

蹲街弑〆低调 提交于 2020-01-14 06:48:18
  PHP一直以来以草根示人,它简单,易学,被大量应用于web开发,非常可惜的是大部分开发都在简单的增删改查,或者加上pdo,redis等客户端甚至分布式,以及规避语言本身的缺陷。然而这实在太委屈PHP了。记得有一次问walker,PHP能做什么?他说:什么都能做啊!当时我就震惊了,这怎么可能。。。直到后来一直看workerman源码,发现PHP原来有很多不为大家所知的诸多用法,包括多进程(还有线程)、信号处理、namespace等等一大堆特点。而workerman正是这些很少被使用特性(或者说扩展)的集大成者,如果非要说它的缺点,那就是PHP的缺点了,当然PHP的优点它全占了~而且PHP7发布在即,workerman必将得到更多的优化,搭配HHVM更是叼的不行。 workerman   版本:3.1.8(linux)   模型:GatewayWorker(Worker模型可与之类比)   注:只贴出讲解部分代码,出处以文件名形式给出,大家可自行查看   workerman最初只开发了Linux版本,win是后来增加的,基于 命令行模式运行(cli) 。 多进程模型   工作进程,Master、Gateway和Worker,Gateway主要用于处理IO事件,保存客户端链接状态,将数据处理请求发送给Worker等工作,Worker则是完全的业务逻辑处理,前者为IO密集型