大家好,我是小黑,一个在互联网苟且偷生的农民工。池化线程池是在计算机开发中的一种池化技术,是为了提高资源的利用率,将一些资源重复利用,避免重复的构建来提高效率。类似字符串常量池,数据库连接池,HttpClient连接池等,都是用的池化技术。线程池在没有线程池概念之前,我们要使用线程必须先通过创建一个Thread类来完成线程的构建,并调用start()方法开启,在线程执行完会将线程销毁,而线程资源是很宝贵的,创...
2022-11-02 10:23:51 7595浏览 0点赞 0回复 1收藏
大家好,我是小黑,一个在互联网苟且偷生的农民工。本期带来线程池的第二期内容,如果对线程池的基本概念还不是很清楚,结合上一期[面试官:谈谈你对线程池的理解]口感更佳。本期内容会从以下几个方面解析线程池的具体实现:线程池状态线程池初始化如何执行任务钩子方法等待队列和排队策略自定义拒绝策略线程池关闭动态调整容量合理配置容量线程池状态ThreadPoolExecutor中定义了如下几种线程池状态:RUNNING:运行状态...
2022-11-02 10:22:45 5107浏览 0点赞 0回复 0收藏
大家好,我是小黑,一个在互联网苟且偷生的农民工。队列学过数据结构的同学应该都知道,队列是数据结构中一种特殊的线性表结构,和平时使用的List,Set这些数据结构相比有点特殊,它的特殊之处在于它只允许在队列的头部(Head)进行删除操作,在尾部(Tail)进行插入操作,这种方式的队列我们称之为先进先出队列(FIFO)。先进先出队列在JDK1.5中推出了队列这一数据结构的具体实现,接口Queue是对于队列的定义,并有一...
2022-11-02 10:20:35 4425浏览 0点赞 0回复 0收藏
大家好,我是小黑,一个在互联网苟且偷生的农民工。Runnable在创建线程时,可以通过newThread(Runnable)方式,将任务代码封装在Runnable的run()方法中,将Runnable作为任务提交给Thread,或者使用线程池的execute(Runnable)方法处理。publicclassRunnableDemo{publicstaticvoidmain(String[]args){ExecutorServiceexecutorServiceExecutors.newCachedThreadPool();e...
2022-11-02 10:19:43 6551浏览 0点赞 0回复 0收藏
家好,我是小黑,一个在互联网苟且偷生的农民工。在JDK1.7中引入了一种新的ForkJoin线程池,它可以将一个大的任务拆分成多个小的任务并行执行并汇总执行结果。ForkJoin采用的是分而治之的基本思想,分而治之就是将一个复杂的任务,按照规定的阈值划分成多个简单的小任务,然后将这些小任务的结果再进行汇总返回,得到最终的任务。分治法分治法是计算机领域常用的算法中的其中一个,主要思想就是将将一个规模为N的问题,分解成K...
2022-11-02 10:18:26 4391浏览 0点赞 0回复 0收藏
前言小黑在学习和工作中,经常需要进行写作,无论是记笔记,还是写博客,或者工作中需要编写接口文档或者技术文档。在这个过程中,我使用过很多工具,最开始使用word,但是需要花费很多的时间在格式调整和排版上;也使用过一些笔记软件,印象,有道,为知等一系列,但是都有一个问题,就是我如果笔记中有图片,那么我想把笔记内容再发到别的博客平台上时,需要单独对图片进行上传,然后在博客内容中替换,相当的耗费时间和精力...
2022-11-02 10:17:54 5698浏览 0点赞 0回复 1收藏
前言小黑在开发中遇到个问题,我负责的模块需要调用某个三方服务接口查询信息,查询结果直接影响后续业务逻辑的处理;这个接口偶尔会因网络问题出现超时,导致我的业务逻辑无法继续处理;这个问题该如何解决呢?小黑首先想到的就是重试嘛,如果失败了就再调用一次。问题来了,如果又失败了呢?接着重试嘛。我们循环处理,比如循环5次,全失败则任务服务不可用,结束调用。如果我又想着5次调用间隔一段时间呢?第一次先隔1秒,然...
2022-11-02 10:16:49 6323浏览 0点赞 0回复 0收藏
概述在计算机程序中所有的数都是以二进制形式存储的。位运算就是直接对整数在二进制进行计算操作。作为一名程序员掌握位运算的基本使用是很重要的,而对于算法程序员来说,位运算的灵活使用能够更灵活高效的解决很多问题。位运算都有哪些符号描述运算规则&与同为1时结果为1,其它为0或同为0时结果为0,其它为1^异或相同为0,不同为1取反0变1,1变0<<左移各位左移,高位丢弃,低位补0>>右移各位右移,低位丢弃,如果该数为正则高...
2022-11-02 10:15:59 5340浏览 0点赞 0回复 0收藏
在高并发环境下,为了保证系统的稳定,通常会用到限流、降级、熔断等手段,来保证系统的稳定可用。限流顾名思义就是限制服务处理的流量,其实熔断、降级本质上也是限流的一种,都是阻断了请求流量,本篇文章重点介绍常见的限流算法。为什么限流为什么需要限流呢?这个问题比较好理解,就是请求服务的流量过大,会导致服务崩溃,为了避免这种情况的发生,所以要对流量进行限制。在以下这些常见的情况下可能会引起流量激增:促销...
2022-11-02 10:15:23 5122浏览 0点赞 0回复 0收藏
前言单例设计模式是GOF23中设计模式中常见的设计模式之一,不论是在我们日常开发,还是一些第三方库中几乎都能见到单例模式。包括在面试时初中级的程序员基本都会被问到单例模式。单例模式的目的主要是为了保证在多线程场景下实例唯一的一种解决方案,实现起来还是比较简单的,但是实现方式各式各样,五花八门,今天小黑带大家梳理下单例模式的7种实现方式,并比较各有什么优缺点。饿汉式饿汉式,顾名思义一上来就会创建实例对...
2022-11-02 10:14:09 5525浏览 0点赞 0回复 0收藏
epoll可以说是编写高性能服务端程序必不可少的技术,在介绍epoll之前,我们先来了解一下多路复用IO吧。多路复用IO多路复用IO:是指内核负责监听多个IO流,当任何一个IO流处于就绪状态(可读或可写)时都会通知进程,以便可以处理该IO流上的数据。如图1所示:如图1所示,内核负责监听多个IO流,当某些IO流变为就绪状态,内核会把这些IO流添加到就绪队列中,然后通知进程处理就绪队列中的IO...
2022-11-02 10:11:17 4687浏览 0点赞 0回复 0收藏
前言我们日常开发中,很多小伙伴容易忽视安全漏洞问题,认为只要正常实现业务逻辑就可以了。其实,安全性才是最重要的。本文将跟大家一起学习常见的安全漏洞问题,希望对大家有帮助哈。如果本文有什么错误的话,希望大家提出哈,感谢感谢1.SQL注入1.1什么是SQL注入?SQL注入是一种代码注入技术,一般被应用于攻击web应用程序。它通过在web应用接口传入一些特殊参数字符,来欺骗应用服务器,执行恶意的SQL命令,以达到非法获取系...
2022-11-02 10:10:04 5455浏览 0点赞 0回复 0收藏
前言看到这个标题你可能会说,TCP连接的建立与断开,这个我熟,不就是三次握手与四次挥手吗?且慢,脑海中可以先尝试回答这几个问题:四次挥手是谁发起的?如果断电断网了连接会断开吗?什么情况下没有四次挥手连接也会断开?这不是面试,而是遇到了实际问题,至于是什么问题,容我先卖个关子,本文也不会解答,后面会有一篇专门的文章来说遇到的问题是啥,所以在讲实际问题之前,先弄懂理论。正常断开我们由浅入深,先了解正常...
2022-10-25 11:59:39 7367浏览 1点赞 0回复 1收藏
背景很久之前我给业务方写了一个dubboloadbalance的扩展(为了叙述方便,这个loadbalance扩展就叫它XLB吧),这两天业务方反馈说XLB不生效了我心想,不可能啊,都用了大半年了排查于是我登上不生效的consumer机器进行排查,还好我留了一手,当XLB加载时,会打印一行日志看了下这个服务,并没有打印日志,说明XLB并没有加载成功于是,我就去问对应的开发,有按照我的文档配置loadbalance吗?...
2022-10-25 11:59:04 5187浏览 0点赞 0回复 0收藏
上节中我们知道了SentinelGo大概能做什么事情,最简单的例子如何跑起来其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链模式,二合一,内容显得丰富一些。初始化流程初始化做了什么SentinelGo初始化时主要做了以下2件事情:通过各种方式(文件、环境变量等)载入全局配置启动异步的定时任务或服务,如机器cpu、内存信息收集、metriclog写入等等初始化流程详解提供的API上节...
2022-10-25 11:58:21 4922浏览 0点赞 0回复 0收藏
曾有读者问我之前的文章《微服务网关演进之路》里提到的编程框架SpringWebflux有没有比较好的学习资料或者文档。我都是看官方文档和网上比较零碎的资料,对新手来说不友好。也想过自己来写一个关于响应式编程的系列文章,奈何水平有限,很多东西我自己也是一知半解,就不来误人子弟了。很多情况下,在大的空间和时间维度上,数量级经常会大到超出我们的认知范畴,我们的直觉总是不可靠的。一、举两个空间维度...
2022-10-25 11:57:14 4433浏览 0点赞 0回复 0收藏
背景最近负责的一个自研的Dubbo注册中心经常收到CPU使用率的告警,于是进行了一波优化,效果还不错,于是打算分享下思考、优化过程,希望对大家有一些帮助。自研Dubbo注册中心是个什么东西,我画个简图大家稍微感受一下就好,看不懂也没关系,不影响后续的理解。Consumer和Provider的服务发现请求(注册、注销、订阅)都发给Agent,由它全权代理Registry和Agent保持Grpc长链接,长链接的目的主要是Provider方有变更时,能及时推...
2022-10-25 11:56:08 5392浏览 0点赞 0回复 0收藏
前言最近翻看以前写的PPT,发现了在2019年做的一次技术分享,关于Java问题排查,由于没什么公司机密可言,整理下分享给大家线上问题处理流程直接放PPT截图吧,现在看来依然不过时问题排查可从三个方面入手知识:有些问题,思考一下就有答案,就像传说中多隆那样,回忆下就知道第83行代码有问题工具:当然不是每个人都能做到过目不忘,也有可能这代码完全不是你写的,这时就需要靠工具来定位问题数据:程序运行时产生的数据,也...
2022-10-25 11:54:54 4539浏览 0点赞 0回复 0收藏
从一次重构说起这事儿还得从一次重构优化说起。最近在重构一个路由功能,由于路由比较复杂,需求变化也多,于是想通过责任链模式来重构,刚好这段时间也在SentinelGo中看到相关源码。用责任链模式,最大的好处是可以针对每次请求灵活地插拔路由能力,如:这样实现会在每次请求到来时去new出整个责任链,可以预见对象会频繁的创建、销毁。对Java来说,对象池并不推荐,除非对象的创建特别费力,像一个...
2022-10-25 11:54:11 5071浏览 0点赞 0回复 0收藏
要说现在工程师最重要的能力,我觉得工程能力要排第一。就算现在大厂面试经常要手撕算法,也是更偏向考查代码工程实现的能力,之前在群里看到这样的图片,就觉得很离谱(大概率是假的)。算法与工程实现在SentinelGo中,一个很核心的算法是流控(限流)算法。流控可能每个人都听过,但真要手写一个,还是有些困难。为什么流控算法难写?以我的感觉是算法和工程实现上存在一定差异,虽然算法好理解,但却没法照着实现。举个例子...
2022-10-25 11:53:37 5427浏览 0点赞 0回复 0收藏