![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 90
峰马
这个作者很懒,什么都没留下…
展开
-
Guava提供的RateLimiter限流原理以及漏桶算法和令牌桶算法
文章目录漏桶算法、令牌桶算法思路及使用场景RateLimiter实现原理SmoothBurstySmoothWarmingUp漏桶算法、令牌桶算法思路及使用场景在介绍RateLimiter之前我们先看下常说的漏桶算法和令牌桶算法,看下两种算法的思想和适用场景:漏桶算法:结合上面的图,漏桶算法就是将请求放入桶中,然后始终以一个固定的速率从桶中取出请求来处理,当桶中等待的请求数超过上限后(桶的容量固定),后续的请求就不再加入桶中,而是执行拒绝策略(比如降级)适用于需要以固定速率的场景,而在多数业务场原创 2021-05-14 00:05:33 · 3041 阅读 · 4 评论 -
线程池中使用的SynchronousQueue的offer和take原理
使用场景线程池ThreadPoolExecutor中经常使用SynchronousQueue作为阻塞队列,比如dubbo的provider的线程池默认会使用该队列,这里要先介绍下线程池ThreadPoolExecutor的逻辑,ThreadPoolExecutor的构造方法如下:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,原创 2021-04-29 03:16:06 · 2631 阅读 · 2 评论 -
ConcurrentHashMap的扩容方法transfer源码详解
主要细节问题:什么时候触发扩容?扩容阈值是多少?扩容时的线程安全怎么做的?其他线程怎么感知到扩容状态,从而一起进行扩容?多个线程一起扩容时,怎么拆分任务,是不是任务粒度越小越好?ConcurrentHashMap.get(key)方法是没有加锁的,怎么保证在这个扩容过程中,其他线程的get(key)方法能获取到正确的值,不出现线程安全问题?魔鬼在细节里,一起看下源码,然后回答下上面的细节问题,先看下触发扩容的代码,在往map中put新数据后会调用这个addCount(long x, int原创 2021-04-08 00:37:08 · 692 阅读 · 2 评论 -
算法的时间复杂度和空间复杂度详解
通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。算法执行时间需通过依...转载 2019-01-06 23:58:41 · 636 阅读 · 0 评论 -
EnumSet原理介绍
为了便于理解EnumSet,需要先知道这种数据结构是为了解决什么问题而设计的。一、场景举例一个场景,你系统里的用户会有各种身份,而一个用户会有多个身份,你设计了一个UserDTO对象,这时候要考虑怎么来表示身份,有一种比较常用的方法,比如定义一个Long属性,long类型有64位,每一位对应一种身份,1标识拥有该身份,0标识没有该身份。这样做就比较节省空间,那么在对这个UserDTO增加身份、...原创 2019-06-27 01:34:20 · 482 阅读 · 0 评论 -
拜占庭将军问题对应的分布式一致性算法
拜占庭将军问题描述: 有N位将军一起合作进行军事行动,其中有M位叛将,这N位将军里有一位话事人(有可能由叛将担任话事人),话事人以通信的方式给其他将军发布军事指令,军事指令假设只有进攻和撤退两种,要有一种算法保证在该话事人给其他将军发送不一致的行动指令的情况下(部分将军收到进攻指令,部分将军收到撤退指令),所有的忠将都采取一致的动作,要么一起进攻,要么一起撤退。 翻译成分布式环境下的一致性...原创 2019-09-05 00:52:13 · 919 阅读 · 0 评论