自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

xindoo

代码、算法和人生

原创 如何把百度伪装成Google

作为技术人使用百度被鄙视?但因为种种原因无法使用Google,为了解决这个尴尬的问题,我特意研发了一款chrome插件,可以将百度的logo换成google的logo,完美的解决这个尴尬的问题。 妈妈再也不用担心我因为用百度搜索技术问题而被同事嘲笑了。 使用效果如下: 看到这也许你有很多的问题...

2020-08-09 19:55:13 5493 26

原创 如何制作一个可以自动更新的Github个人主页
原力计划

Github近期上线一个新的功能,就是你在自己账号下创建一个和自己用户名同名的仓库,并在仓库下创建一个README.md文件,这个文件就会被展示在你的Github个人主页。源于markdown的强大描述能力,你可以在你的Github首页展示各种各样的信息,甚至有人直接将自己个人简历挂上面,极大丰富...

2020-08-09 18:14:58 3184 11

原创 [视频]程序猿到底要不要刷Leetcode?

程序猿到底要不要刷Leetcode.mp4

2020-08-03 10:01:34 355 8

原创 JDK11现存性能bug(JDK-8221393)深度解析
原力计划

这是一篇鸽了很久的博客,因为博客内容和素材早就准备差不多了,但就是一直懒得整理,今天终于下定决心终于整理出来了。 先大致介绍下这个bug,准确说这个应该是jdk11新引入的zgc的一个bug,该bug在被触发的情况下会导致进程CPU使用率会逐渐升高,如果不管的话最终CPU会到100% 影响服务可用...

2020-07-12 13:07:16 5671 6

原创 生日悖论是啥?我用它省了上百G的内存
原力计划

生日悖论: 是指在不少于 23 个人中至少有两人生日相同的概率大于 50%。例如在一个 30 人的小学班级中,存在两人生日相同的概率为 70%。对于 60 人的大班,这种概率要大于 99%。从引起逻辑矛盾的角度来说,生日悖论并不是一种 “悖论”。但这个数学事实十分反直觉,故称之为一个悖论。 生日悖...

2020-07-04 13:44:53 4580 2

转载 为什么美国程序员工作比中国程序员工作轻松、加班少?

转自:量子位(整理)+ 知乎 按惯例,先问是不是,再问为什么。 从知乎回答浏览量看,是的。 那么为什么美国程序员就可以到点下班回家,而中国程序员就要每天“主动”、“无偿”加班呢? 仔细看了群众们热情的回答之后,大概可以分为几派: 1、产品经理不够通情达理,导致效...

2020-07-02 12:22:42 287 2

翻译 一文理解操作系统虚拟内存

原文地址An introduction to virtual memory 计算机是用来执行简单任务的复杂机器:比如 上网、文本编辑、网页服务、视频游戏……,还可以对数据进行操作,图片 音乐 文本 数据库…… 当计算机不使用的时候,程序和数据都安静地躺在磁盘里,即便你关机了数据也会在。运行一个应...

2020-06-25 14:44:58 255 0

原创 Json字段选取器介绍和实现
原力计划

最近为了工作方便写了一个小工具,这个小工具作用很简单,就是从一个json字符串中筛出你想要的部分。 介绍 背景是这样的,我们为了线上调试方便,有个工具可以模拟发起一次数据请求,然后将结果以json的形式展示到页面上。但问题是这个数据包含的信息非常多,动不动就上千行(如上图),但每次debug的时候...

2020-06-20 22:54:42 287 0

原创 从0到1打造正则表达式执行引擎(二)
原力计划

在上篇博客从0到1打造正则表达式执行引擎(一)中我们已经构建了一个可用的正则表达式引擎,相关源码见https://github.com/xindoo/regex,但上文中只是用到了NFA,NFA的引擎建图时间复杂度是O(n),但匹配一个长度为m的字符串时因为涉及到大量的递归和回溯,最坏时间复杂度是...

2020-05-31 20:03:26 859 1

原创 技术团队如何培养新人
原力计划

文章目录对新人设立明确的阶段性目标提高新人培训的优先级和重视程度完善师徒体系增加理论知识的比重模拟实战经验分享定期培训题外话 水一篇我17年写的内容。背景是我当时工作方向上的变化,但一直感觉上手很慢。刚工作时也有这种体会,当时纯觉得自己菜,但后来看了《Site Reliability Engine...

2020-05-18 21:50:50 422 0

原创 面试题精选:循环队列
原力计划

近期在面试找工作的小伙伴们很多啊,我周围就有好几个认识的朋友在找工作,于是我突发奇想在CSDN开了一个面试题精选的专栏,主要会关注一些算法题、设计题,次要会补充一些java面试相关的题(比较本博主是java出身)。其实在此之前已经写过一些相关的文章了,已经整理到专栏里的,后续会持续更新,希望对大家...

2020-05-10 17:06:57 223 0

原创 从0到1打造正则表达式执行引擎(一)
原力计划

文章目录前置知识有限状态机状态机下的正则表达式串联匹配并连匹配 (正则表达式中的 **|**)重复匹配(正则表达式中的 **? + ***)重复0-1次 ?重复1次以上重复0次以上匹配指定次数特殊符号(正则表达式中的 **. \d \s……**)子表达式(正则表达式 **()**)练习题代码实现建...

2020-05-01 17:28:42 9464 16

原创 面试题精选:求根号2简单?高级算法你肯定不会
原力计划

前两天逛github看到一道很简单的面试题——如何不用库函数快速求出2\sqrt22​的值,精确到小数点后10位! 第一反应这不很简单嘛,大学数据结构课讲二分查找的时候老师还用这个做过示例。但转念一想,能作为大厂的面试题,背后绝对没有那么简单,于是我google了下,结果找到了更巧妙的数学方法,甚...

2020-04-12 20:30:23 749 0

原创 欢迎关注我的微信公众号

公众号注册n年了,但一直都没怎么发过文章,真是五年运营四年敷衍,去年年底在做自我年终总结的时候放下豪言说要开始重新运营公众号了,但一拖就拖到了3月底。这几个月想了好久的公众号定位,大概有些方向了(下文细说),所以决定摒弃我这间歇性踌躇满志持续性萎靡不振的毛病,硬着头皮开更了。 自我介绍 大家好 我...

2020-03-22 23:51:17 405 1

原创 StampedLock源码分析
原力计划

文章目录前言乐观锁 or 悲观锁源码分析构造函数读锁相关API乐观读锁的实现读锁的获取读锁的释放写锁相关API写锁的获取写锁的释放其他API读锁转写锁写锁转读锁转乐观锁ReadLockView和WriteLockView注意事项参考资料 前言 之前已经说过了ReentrantLock Reentr...

2020-03-22 16:22:04 485 0

翻译 技术人必须知道的42个谷歌搜索技巧

前言 作为一个技术人,经常会遇到自己不懂或不知道的东西,这个时候就必须使用搜索引擎搜索相关的资料,当然大部分人都逃不过google,google上的内容繁多,如何快速检索和筛选自己想要的信息却成了问题。其实google提供了高级搜索的方式,只是很多人都不太清楚,配合简单的google搜索表达式,可...

2020-03-15 22:31:11 835 0

原创 Antlr实战之JSON解析器slowjson

最近一直在学习编译原理,然后就了解到了antlr4这个强大的工具,antlr的全称是(Another Tool for Language Recognition),是一款很强大的词法和语法分析工具,虽然是用java写成的,但它也能生成c++、go……等语言的代码。它的主要作用就是你可以用巴科斯范式...

2020-03-08 20:49:11 582 0

转载 刘未鹏:为什么你应该(从现在开始就)写博客

今天转载一篇刘未鹏10多年前的一篇博客《为什么你应该(从现在开始就)写博客》,我觉得总结的非常好,上大学的时候我就看过了,因为这篇博客所以我从13年开始坚持写博客。刘未鹏最近博客也不更了,可能他的博客慢慢就沉下去了,但我觉得他很多优质的内容不能沉,就比如这篇文章,我觉得很适合初入CSDN、刚开始学...

2020-03-01 18:33:20 496 1

翻译 Java volatile 关键词

文章目录变量可见性问题Java volatile可见性保证volatile 完全可见性保证指令重排序挑战Java volatile和有序性(Happens-Before)保证volatile还不够什么时候volatile就足够了?volatile的性能考量原文地址 Java中的volatile关键...

2020-02-23 19:41:58 223 0

原创 如何做好一个面试官

找到了我17年写的一篇关于面试官的思考,没有发在csdn上,经过三年的时间,今天看来某些想法不够成熟,所以整理修改后重新发出来。 首先声明一点,我没怎么面试过别人,只是参加过几场面试,经历的面试官只有小20个吧,所以根本没有资格去评判某个面试官是不是合格的面试官。但经过我最近的一些经历,以及朋友...

2020-02-20 21:42:56 4677 6

翻译 10行命令60秒快速定位性能瓶颈

文章目录总述1. uptime2. dmesg|tail3. vmstat 1每列的含义4. mpstat -P ALL 15. pidstat 16. iostat -xz 17. free -m8. sar -n DEV 19. sar -n TCP,ETCP 110. top后续分析 今天...

2020-02-05 14:56:32 921 0

原创 ReentrantReadWriteLock源码解析

上回说到ReentrantLock,今天来谈谈读写锁(ReentrantLock)和其具体实现ReentrantReadWriteLock。看这篇文章前,强烈建议你回到先读懂ReentrantLock,因为ReentrantReadWriteLock其实是在ReentrantLock的基础上实现的...

2020-02-03 20:54:50 802 0

原创 我的2019年终总结

时光荏苒,岁月如梭,不知不觉一年又过去了。19年的互联网格外的不景气,到处充斥着暴雷、裁员,然而这些都和我无关,但这些都让深刻认识到了困难时期抱着大厂大腿的好处(还好我18年没跳槽去小厂,哈哈)。 回到年终总结,这已经是我连续第七年写年终总结了(文末可以看到其他年份的),首先我们来回顾下去年立的...

2020-01-13 09:44:14 3511 5

原创 Web服务压测神器wrk

wrk是一款开源的高性能http压测工具(也支持https),非常小巧,可以执行文件只有3M(其中主要是luajit和openssl占用绝大多数空间),别看核心代码3-5年没更新了,但依旧非常好用。虽然很早之前我就知道有这么个工具了,当时学习这个工具的时候我还拿它压测了我们的个人网站xindoo....

2019-12-29 16:29:04 4320 1

原创 ReentrantLock源码解析

谈到多线程,就不避开锁(Lock),jdk中已经为我们提供了好几种锁的实现,已经足以满足我们大部分的需求了,今天我们就来看下最常用的ReentrantLock的实现。 其实最开始是想写一篇关于StampedLock的源码分析的,但发现写StampedLock前避不开ReentrantReadWri...

2019-12-20 19:19:37 1548 0

原创 布隆过滤器(BloomFilter)原理 实现和性能测试

布隆过滤器是一种大家在学校没怎么学过,但在计算机很多领域非常常用的数据结构,它可以用来高效判断某个key是否属于一个集合,有极高的插入和查询效率(O(1)),也非常省存储空间。当然它也不是完美无缺,它也有自己的缺点,接下来跟随我一起详细了解下BloomFilter的实现原理,以及它优缺点、应用场景...

2019-11-21 19:28:08 5513 2

翻译 Google是如何做Code Review的

听说今天发原创有徽章,先占个坑,等周末有空补上内容。 本篇博客内容 我和几个小伙伴一起翻译了google前一段时间放出来的Google’s Engineering Practices documentation,之后我会整理一下放在这里。 翻译后的github仓库https://github.co...

2019-10-27 16:28:20 5721 4

原创 用正则表达式匹配3的任意倍数

正则表达式能匹配3的任意倍数?(注意是任意倍数) ,我曾经也很震惊,但确实可以。我5年多前练习正则表达式,在Regex Golf这个正则表达式测试网站上发现了这个题,当时完全没有任何头绪,于是我在知乎提问正则表达式如何匹配 3 的倍数 ,但是得到了好多知乎大佬的关注,也上了当天的热榜。 排名第一的...

2019-10-20 12:12:14 5118 5

原创 一文告诉你CPU分支预测对性能影响有多大

来源于stackoverflow上的一个问题为什么处理有序数组比处理无需数组快,原文中已经有了一些探讨,这里我们首先来复现下结果,然后再解释下为什么! 我们有如下两段代码,代码看起来都是差不多的,实际上逻辑也是一样的,都是统计数组中小于THRESHOLD数的个数,唯一的区别是一个是在无序数组中统计...

2019-09-30 12:03:06 5472 5

原创 Java自制简易线程池(不依赖concurrent包)

很久之前人们为了继续享用并行化带来的好处而不想使用进程,于是创造出了比进程更轻量级的线程。以linux为例,创建一个进程需要申请新的自己的内存空间,从父进程拷贝一些数据,所以开销是比较大的,线程(或称轻量级进程)可以和父进程共享内存空间,让创建线程的开销远小于创建进程,于是就有了现在多线程的繁荣。...

2019-08-25 19:33:57 1427 0

原创 Alfred上可提高工作效率的Workflow推荐

温馨提示:本文中Alfred是Mac平台的工具,不适用于其他平台。 Alfred是Mac平台上被很多人吹爆的一款效率提升软件,我刚毕业工作的时候就看到公司内网有人推荐,但没有尝试。 后来我跳槽后自己买了Macbook pro,在努力把笔记本打造成高效开发工具时,又重新发现了这个app,又毫不犹豫的...

2019-08-22 09:31:10 3692 0

原创 局部性原理——各类优化的基石

学过计算机底层原理、了解过很多架构设计或者是做过优化的同学,应该很熟悉局部性原理。即便是非计算机行业的人,在做各种调优、提效时也不得不考虑到局部性,只不过他们不常用局部性一词。如果抽象程度再高一些,甚至可以说地球、生命、万事万物都是局部性的产物,因为这些都是宇宙中熵分布布局、局部的熵低导致的,如果...

2019-07-28 16:38:21 1376 3

原创 持续学习——程序猿的军备竞赛

“持续学习”是几乎所有大神都会给菜鸟们的建议之一,这个概念也不是最近被提出来的,早在两千多年前古希腊哲学家梭伦就提出“活到老学到老”,这可算最早的“持续学习”。近些年来持续学习在IT领域里又不不断被提及,程序猿们成为持续学习最大的一群实践者,我从没看到过那个其他行业的普通员工要像程序猿一样学习那么...

2019-06-30 15:31:42 1664 1

原创 浮点数美丽的表象(为什么要慎用浮点数)

现在假设你负责一个广告公司的结算系统,你需要统计下月度点击收入,生成一个月度报告。假设有2000w个点击,每个点击平均1元,我们用小学数学计算就知道总收入是2000w。但是我们用计算机累加就会出问题了。如果我们用float存储数据,float可以表示的数据范围−2128-2^{128}−2128到...

2019-06-25 22:17:07 797 0

原创 Ehcache食用指南

最近我们有个服务的时延(Latency)略微上涨,gc时间上涨了一倍,dump出java堆(Heap)之后用mat分析发现,有份cache数据占据了20%+的堆内存,拥有上千万个小对象。然而这部分数据只是部分逻辑会用到,所以它占据这么大的堆内空间显得有些不值,并且会影响到gc进而影响到服务的时延。...

2019-06-22 17:37:05 1578 0

转载 一文理解内存屏障

内存屏障是硬件之上、操作系统或JVM之下,对并发作出的最后一层支持。再向下是是硬件提供的支持;向上是操作系统或JVM对内存屏障作出的各种封装。内存屏障是一种标准,各厂商可能采用不同的实现。 本文仅为了帮助理解JVM提供的并发机制。首先,从volatile的语义引出可见性与重排序问题;接下来,阐述...

2019-05-15 14:40:20 1054 0

原创 Java中的String、StringBuffer和StringBuilder

作为作为一个已经入了门的java程序猿,肯定对Java中的String、StringBuffer和StringBuilder都略有耳闻了,尤其是String 肯定是经常用的。但肯定你有一点很好奇,为什么java中有三个关于字符串的类?一个不够吗!先回答这个问题,黑格尔曾经说过——存在必合理,单纯一...

2019-05-11 14:26:29 812 0

原创 LinkedHashMap源码解析

相信即便是Java初学者都应该用过Java中的HashMap和TreeMap,但貌似大多数人都没怎么用过LinkedHashMap,对其知之甚少。因为基本上大多数情况下TreeMap和HashMap都能满足需求,只有在需要map中K-V保持一定顺序时才会用到LinkedHashMap。所以保序是L...

2019-04-13 15:43:47 729 0

原创 PriorityQueue 源码分析

学过数据结构的人应该对Queue 队列很熟悉了,队列是一种先进先出(FIFO)的数据结构,所以它出队列的优先级就是进入队列的次序。但我们有时候需要其它的优先级,很多高级语言都会提供带优先级的队列,在Java中就是PriorityQueue了,今天我们来看下PriorityQueue的使用和实现。 ...

2019-04-06 11:51:48 1009 0

原创 ThreadLocal Java多线程下的影分身之术

如果写过多线程的代码,你肯定考虑过线程安全问题,更进一步你可能还考虑在在线程安全的前提下性能的问题。大多数情况下大家用来解决线程安全问题都会使用同步,比如用synchron或者concurrent包提供的各种锁,当然这些都能解决问题。但有多线程做同步一定会涉及到资源争抢和等待的问题。java中各种...

2019-03-24 15:56:54 879 3

提示
确定要删除当前文章?
取消 删除