JDK源码分析系列--HashMap.TreeNode
这篇可以看作是JDK源码分析系列–HashMap的下篇。java.util.HashMap.TreeNode是HashMap中非常重要的一个类,主要目的在于:当哈希冲突比较严重的时候,提升HashMap的查询效率。尽管实际用到的概率不高,却占了HashMap篇幅的1/4左右。因此在这写一篇单独分析。 ...
阅读更多
为什么HashMap链表转红黑树的阈值是8
在JDK1.8中,HashMap引入了红黑树结构。当链表(不包括头结点)长度>=8,且数组长度> = 64时,会触发链表转红黑树的逻辑,以提升查询效率。那么为什么是8? 对话 回答这个问题前,先看一组对话。 我:请问HashMap中什么时候会出现红黑树? 小Z:当哈希冲突严重时,链表 ...
阅读更多
记一次Redis Cluster故障转移后的问题
出于数据安全的考虑,我们项目中的Redis集群是自己部署的,未使用云服务。有天运维突然打来电话,线上redis挂了,重启了也不行。心想不可能,高可用架构怎么会出错? 背景 我使用三台服务器部署了redis的cluster三主三从集群。为避免单点故障,采用交叉部署,如下图所示 问题 排查发现, ...
阅读更多
秒杀场景下对象池化引发的思考
秒杀场景下,涉及到短时间大量请求,虽然最终落到数据库的请求很少,但这过程会涉及到许多临时对象的创建(如订单请求DTO、库存DTO),导致频繁youngGC。Young GC在Stop-The-World(STW)期间,JVM必须暂停所有线程,会导致请求延迟飙升,违背秒杀系统的低延迟要求。因此需要引入 ...
阅读更多
JDK源码分析系列--J.U.C并发工具类
本文从实际场景出发,对j.u.c包下的四个并发工具的使用进行演示。相信看完以后会对他们的区别和关联有更多了解。 CyclicBarrier j.u.c.CyclicBarrier中文翻译循环栅栏,即可以在多个线程都执行完成后再触发,且支持循环使用。 场景一 下面场景是5个客人相约到饭店吃饭,只 ...
阅读更多
个人博客切换服务器(阿里云版)
之前的阿里云服务器是在2020年双十一新用户活动购买的,一晃三年已经到期,高昂的续费价格劝退。本来想要切换到腾讯云,但感觉有点繁琐。恰巧阿里云推出了一年99元新老用户同享的活动,且承诺续费不涨价!遂购买并顺利切换。在此记录下整个过程。 背景 我是使用 阿里云服务器+域名+hexo 来搭建的个人博 ...
阅读更多
KaTeX公式异常问题解决
自建博客最大的问题就是麻烦。因为很多组件都依赖开源网站,一会浏览量数据没了,一会评论功能不能用,今天发现数学公式也不能展示了 背景 一般的MarkDown工具都支持LaTeX 语法,可以直接将文本转换成公式,比图片高级。比如 E=mc2E=mc^2 E=mc2 更复杂一点的有 lim⁡x→∞1x ...
阅读更多
JDK源码分析系列--ThreadPoolExecutor
线程池是众多池化思想的一种。在Java中,与多线程相关的是java.util.concurrent包,而其中最核心的便是线程池类java.util.concurrent.ThreadPoolExecutor。该类包含了线程池的维护与任务执行的过程。本文主要围绕ThreadPoolExecutor,既 ...
阅读更多
Linux部署系列--ELK
项目中的日志系统使用的是ELK(elasticsearch + logstash + filebeat),其中filebeat负责从每个服务器的日志文件中提取数据并发送给logstash,logstash负责数据过滤并存储到es,es负责数据存储和提供查询。 整个搭建与配置过程比较繁琐,想着在这里记 ...
阅读更多
JDK源码分析系列--LinkedHashMap
引言 前面已对java.util.HashMap的源码做了详细的分析。HashMap底层采用哈希表,保证了put和get操作的高效。但也导致了遍历操作是无序的。java.util.LinkedHashMap则是在HashMap的基础上,维护了一条双向链表,记录了节点的插入顺序。使遍历操作可以按插入 ...
阅读更多