Entry

我的jdk源码(十九):TreeMap类 红黑树实现的map结构

北战南征 提交于 2020-08-14 13:02:58
一、概述 TreeMap类是一个有序的key-value的集合,与HashMap不同,TreeMap底层只有一个红黑树的结构(对红黑树不了解或者不熟悉的和觉得文字太枯燥的,推荐一个在线演示地址: https://rbtree.phpisfuture.com/ ),结点TreeMap类的内部类Entry,维护树结构;并且由于红黑树的特性,使得元素保存在TreeMap中默认是根据key值的自然顺序排序,也可以传入特定的比较器实例使TreeMap维持指定的顺序。所以,当你既想利用Map的高效查找特性,又想维持元素特定的顺序,那么你就需要用到TreeMap类。 二、源码分析 1. 类的声明 public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable 可以看到TreeMap类继承自AbstractMap类,并且实现了NavigableMap接口、Cloneable接口以及Serializable接口。具体如下: a. 继承于AbstractMap,所以它是一个Map,即一个key-value集合。 b. 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。 c.

(三)学习了解OrchardCore笔记——灵魂中间件ModularTenantContainerMiddleware的第一行①的模块部分

我的梦境 提交于 2020-08-14 11:34:23
  了解到了OrchardCore主要由两个中间件(ModularTenantContainerMiddleware和ModularTenantRouterMiddleware)构成,下面开始了解ModularTenantContainerMiddleware中间件第一行代码。   了解asp.net core机制的都知道中间件是由构造函数和Invoke(或者InokeAsync)方法构成,构造函数不过就是个依赖注入的过程,Invoke也可以直接依赖注入,两者的区别是构造函数时全局的,Invoke只是当次请求,所以从Inovke开始了解! public async Task Invoke(HttpContext httpContext) { // Ensure all ShellContext are loaded and available. await _shellHost.InitializeAsync(); var shellSettings = _runningShellTable.Match(httpContext); // We only serve the next request if the tenant has been resolved. if (shellSettings != null ) { if (shellSettings.State ==

Alibaba Sentinel 骨架源码阅读

假如想象 提交于 2020-08-14 10:49:55
Sentinel 的核心骨架,将不同的 Slot 按照顺序串在一起(责任链模式),从而将不同的功能(限流、降级、系统保护)组合在一起。slot chain 其实可以分为两部分:统计数据构建部分(statistic)和判断部分(rule checking)。核心结构: 业务埋点示例 // 资源的唯一标识 String resourceName = "testSentinel"; Entry entry = null; String retVal; try { entry = SphU.entry(resourceName, EntryType.IN); // TODO 业务逻辑 retVal = "passed"; } catch (BlockException e) { // TODO 降级逻辑 retVal = "blocked"; } catch (Exception e) { // 异常数统计埋点 Tracer.trace(e); throw new RuntimeException(e); } finally { if (entry != null) { entry.exit(); } } 这段代码是Sentinel业务埋点示例,通过示例我们可以看出Sentinel对资源的控制入口是 SphU.entry(resourceName, EntryType.IN); ,源码如下

Flex移动布局中单行和双行布局的区别以及使用

烂漫一生 提交于 2020-08-14 08:56:55
这里是单行布局 使用 ul>li 来布局 < ul class ="local-nav" > < li > < a href ="#" > < span class ="local-nav-icon-icon1" ></ span > 攻略景点 </ a > </ li > < li > < a href ="#" > < span class ="local-nav-icon-icon2" ></ span > 门票玩乐 </ a > </ li > < li > < a href ="#" > < span class ="local-nav-icon-icon3" ></ span > 美食林 </ a > </ li > < li > < a href ="#" > < span class ="local-nav-icon-icon4" ></ span > 周边游 </ a > </ li > < li > < a href ="#" > < span class ="local-nav-icon-icon5" ></ span > 一日游 </ a > </ li > </ ul > CSS 样式如下,由于比较懒文字直接加在后面,没有放入标签中。先定义了整体的 .local-nav li [class^="local-nav-icon"] 在 li 中类名中以

Pulsar vs kafka 概念对比

て烟熏妆下的殇ゞ 提交于 2020-08-14 08:19:53
Pulsar Kafka Topic Topic Partition Partition Ledger(Segment)/Fragment/Entry Fragment/Segment Bookie Broker Broker Client SDK Ensemble Size metadata.broker.list Write Quorum Size (Qw) Replica Number Ack Quorum Size (Qa) request.required.acks Qa 是每次写请求发送完毕后需要回复确认的 Bookie 的个数,类似于 Kafka 的 request.required.acks pulsar > topic > partition > Segment(Ledger) > Entry Pulsar vs kafka Pulsar: Topic > partition > Segment(n个segment均匀分布在各节点,单节点只存储了部分segment) > entry > msg Kafka: Topic > partition > Segment(一个分区的所有segment文件全量存储在节点一个目录) 区别: Kafka的一个分区的所有log文件(segment)索引文件都是全量存储在某节点的同一目录这样会有局限性 https://www

HashMap 源码分析

半世苍凉 提交于 2020-08-14 07:28:01
HashMap 是一个散列表,采用 Key-value 键值对的形式存储数据。 HashMap 实现了 Map 接口,不能用于多线程同时更改更改数据的场景,是 线程不安全的 。 Key 和 Value 都可以是 null 值 。 实现 Cloneable 接口,覆写其 clone() 方法,实现数组元素的克隆; 实现 Serializable 接口,表示这可以 系列化传输 ; 继承 AbstractMap 1、HashMap 的结构 在 HashMap 中采用 拉链法 解决 Hash 冲突,也就是通过数组和链表结合起来,如果遇到哈希冲突,就把新的 Node 添加到链表尾部即可。 在 HashMap 中,是根据 hash(key) & (table.length-1) 计算得到其在数组的 index,并通过比较 hash(key) 和 key 的值确定 Node,并把 Node.value 返回。 1.1、JDK 1.8 跟 JDK 1.7 的不同 当链表的长度大于 8 而且 table 数组的长度大于 64 时,会把链表转换为红黑树,使用 treeifyBin(tab, hash); 方法。当数组 table 的长度小于 64 时,会优先使用 resize() 方法给 table 数组扩容。 hash() 计算函数的不同,JDK 1.8 效率更高。 hash() 是扰动函数

BookKeeper 集群搭建及使用

我们两清 提交于 2020-08-14 04:39:15
内容简介:随着 Apache Pulsar 成为 Apache 的顶级开源项目,其存储层的解决方案 Apache BookKeeper 再次受到业界广泛关注。BookKeeper 在 Pulsar 之前也有很多成功的应用,比如使用 BookKeeper 实现了 HDFS NameNode 的 HA 机制(可能大部分公司使用的还是 Quorum Journal Manage 方案)、Twitter 开源的 DistributedLog 系统(可参考这里先对 BookKeeper 的基本概念做一下介绍,下图是 Book 本文转载自: http://matt33.com/2018/10/19/bk-cluster-install-and-use/ ,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。 随着 Apache Pulsar 成为 Apache 的顶级开源项目,其存储层的解决方案 Apache BookKeeper 再次受到业界广泛关注。BookKeeper 在 Pulsar 之前也有很多成功的应用,比如使用 BookKeeper 实现了 HDFS NameNode 的 HA 机制(可能大部分公司使用的还是 Quorum Journal Manage 方案)、Twitter 开源的 DistributedLog 系统(可参考 Twitter开源分布式高性能日志复制服务

[kernel 启动流程] (第六章)第一阶段之——打开MMU【转】

爱⌒轻易说出口 提交于 2020-08-14 04:05:13
转自: https://blog.csdn.net/ooonebook/article/details/52860186 [kernel 启动流程]系列: [kernel 启动流程] 前篇——vmlinux.lds分析 [kernel 启动流程] (第一章)概述 [kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断 [kernel 启动流程] (第三章)第一阶段之——proc info的获取 [kernel 启动流程] (第四章)第一阶段之——dtb的验证 [kernel 启动流程] (第五章)第一阶段之——临时内核页表的创建 [kernel 启动流程] (第六章)第一阶段之——打开MMU [kernel 启动流程] (第七章)第一阶段之——跳转到start_kernel 建议参考文档: ARMV7官方数据手册 ARM的CP15协处理器的寄存器 ================================================ 零、说明 本文是《[kernel 启动流程] (第一章)概述》的延伸, 阅读本文前建议先阅读《[kernel 启动流程] (第一章)概述》 1、kernel启动流程第一阶段简单说明 arch/arm/kernel/head.S kernel入口地址对应stext ENTRY(stext) 1 第一阶段要做的事情

Raft分布式一致性算法整理

*爱你&永不变心* 提交于 2020-08-14 03:03:40
CAP定理 Consistency:一致性 Availability:可用性 Partition-tolerance:分区容错性 CAP定理指出,在异步网络模型中,不存在一个系统可以同时满足上述3个属性。换句话说,分布式系统必须舍弃其中的一个属性。对于需要在分布式条件下运行的系统来说,如何在一致性、可用性和分区容错性中取舍,或者说要弱化哪一个属性,是首先要考虑的问题。 对于高可用性的系统来说,往往会保留强一致性。但对于强一致性的系统来说,有一类专门解决这种问题的算法——共识算法。"共识"的意思是保证所有的参与者都有相同的认知(可以理解为强一致性)。共识算法本身可以依据是否有恶意节点分为两类,大部分时候共识算法指的是没有恶意节点的那一类,即系统中的节点不会向其他节点发送恶意请求,比如欺骗请求。共识算法中最有名的是Paxos算法。其次是Raft和ZAB算法(Zookeeper中的实现) Raft核心算法 Raft算法的核心是选举和日志复制。 当多台服务器同时对外服务时,服务器如何同步变更成了一个问题。一般是采用主从模型,即一个主服务器(Leader),多个从服务器(Follower),所有请求都通过Leader服务器处理,Follower服务器只负责备份数据。但假设Leader服务器宕机了,那么Follower服务器中哪个服务器成为新的Leader服务器呢

Java 代码性能优化,35个细节,让你提升java代码的运行效率

会有一股神秘感。 提交于 2020-08-14 00:37:01
代码优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。 代码优化的目标是 减小代码的体积 提高代码运行的效率 代码优化细节 1、尽量指定类、方法的final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。 此举能够使性能平均提高50% 。 2、尽量重用对象 特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替