- 博客(160)
- 资源 (1)
- 收藏
- 关注
原创 Java 基础 - 线程池是如何回收空闲线程的 ?
说明线程池如何使用?它是如何回收空闲线程的?这类问题可能在面试中经常遇到。本篇博文我将通过源码来对线程池提交任务及回收空闲线程部分的内容进行学习总结。我们都知道在向线程池提交任务时,会有以下三种情况:如果线程池内运行的线程数小于设置的 corePoolSize 值,不论是否有空闲线程都会新创建一个线程执行该任务如果线程数已到达 corePoolSize 值,则会将任务放入任务队列当任务队列已满,并且线程数小于设置的 maximumPoolSize 值,则会新创建线程执行该任务,否则将执行设置的拒
2021-03-13 20:55:26
7067
原创 Java 基础 - List 遍历时为什么不能通过 for 循环进行删除,而使用 Iterator 可以 ?
说明List 在遍历时可以进行添加,删除操作吗?为什么?Iterator 是什么?可以进行上述操作吗?知道底层原理吗?以上问题是我在面试时碰到的,在本篇博文中,我将通过源码对 List 遍历时的添加,删除操作的相关知识点进行总结。注意,这里的操作都是针对正在遍历的 List 自身的操作。首先,回答以上问题:在普通的 for 循环中,可以进行数据的添加操作,但不能进行删除操作。在增强的 for 循环中,既不能进行添加操作,也不能进行删除操作。通过 Iterator 及相关扩展类,可以
2021-02-13 18:58:10
3524
翻译 MySQL 学习(四):锁定读
说明在之前的博文《MySQL学习(三): 一致性非锁定读和 MVCC》 中,我通过翻译官方文档简单介绍了 MySQL 的一致性非锁定读和 MVCC 的基本知识,在本篇博文中我将继续通过官方文档来介绍 InnoDB 事务模型中关于锁定读的相关内容,对应《Locking Reads》章节。通过本篇博文,我们应该了解到在什么情况下应该使用锁定读,并且锁定读有哪些实现方式,不同方式之间有什么区别。正文锁定读在同一个事务中,你如果在查询数据之后,再对相关数据进行插入或更新时,常规的 SELECT 语句无法给
2021-02-10 18:29:10
745
原创 面试总结(三):我的第一次社招之路
说明最近一个月都在忙着面试,白天忙工作,晚上面试,时不时的还要找借口请假去面试。还好面的公司不多,面了酷划,好未来,阿里,字节四个公司,阿里面了两个部门,最后拿到了阿里和字节的 offer。在这里总结下,给想面试的同学有个参考,由于我面的不多,涉及的内容可能不太全面。先简单介绍下背景,2018 年毕业到现在一直在一家公司从事 Java 开发,2020 年 12 月中下旬开始面试到 2021 年 1 月中下旬基本结束,差不多一个月的时间。本文主要分为两个部分,第一部分为当时我碰到的面试题,第二部分为我认
2021-01-27 15:39:17
934
1
原创 写在 2020 年末
魔幻的 2020 终于要过去了,2021 怎么样谁也不知道。北京的天真冷,又出现了零星的病例,希望大家都能安稳地过个好年。又到一年一总结的时候了,今年发生了太多的事情,太多让人记忆深刻的事情。回看 19 年对 20 年的期许 – 保持学习,注意身体,保持乐观。好像就一样做的还行… 还是从工作,学习,生活三方面来总结下今年吧。工作上,公司处在了风口,业务增加不少,自然而然加班就多了起来。业务上负责了一个颇有挑战性的项目,同时还有多个其他项目,整个人就跟单核多线程一样,并发推进。很累,压力很大,但是也收获
2020-12-31 21:54:45
194
原创 Java基础 - Lock 的使用 三个线程交替打印 0-100
说明最近碰到一个问题,使用三个线程交替打印 0-100 。主要考察多线程并发同步,锁的使用。这里记录下我用 Lock 和 多个 Condition 的实现方式。在刚开始实现时,发现在数字输出完毕后,主线程无法停止,最后只能在判断满足条件后直接退出 JVM。这个原因是有线程在调用 await 方法后,没有被唤醒,导致线程没有正常结束。所以,在每个线程执行完毕退出释放锁前,都要进行一次顺序唤醒操作。还有一点需要注意的是,尽量不要在循环中使用 try catch 语句。正文import java.ut
2020-12-20 18:50:18
943
1
翻译 MySQL学习(三): 一致性非锁定读和 MVCC
说明在上一篇博文《MySQL 学习(二):一文了解MySQL InnoDB 的好几种锁》中,我通过翻译 MySQL 的官方文档,简单介绍了 MySQL 存储引擎 InnoDB 支持的几种锁的概念及其作用。在本篇博文中,我将继续通过文档来介绍 InnoDB 事务模型中关于一致性非锁定读相关内容,对应《Consistent Nonlocking Reads》章节。通过本文,我们应该了解一致性非锁定读在不同事务隔离级别下的不同实现方式,了解什么是MVCC(多版本并发控制)。正文一致性非锁定读一致性读指的
2020-12-03 22:59:39
299
原创 MySQL 学习(二):一文了解MySQL InnoDB 的好几种锁
说明本篇博文我将对 MySQL 官方文档的 InnoDB Locking 章节进行翻译学习,通过文档来了解 MySQL 的 InnoDB 引擎的锁的概念,文档基于 MySQL8 版本。示例代码均使用默认的事务隔离级别。通过本篇博文,我们应该了解 InnoDB 有哪些锁,不同类型锁的概念及其作用。正文共享锁和排他锁 [Shared and Exclusive Locks]InnoDB 存储引擎实现了两种标准的行级锁,分别为共享锁(S)和排他锁(X):共享锁允许事务持有锁进行读行数据排他锁允许事
2020-11-14 20:01:36
309
原创 MySQL 学习(一):一文了解 COUNT() 函数的使用及优化方式
说明平时工作最不陌生的就是对数据库的 CRUD 操作,尤其在需要进行分页查询时,要先根据给定参数查询符合条件的记录行数,这里就要使用到 MySQL 的 COUNT() 函数。本篇博文,我将通过 MySQL 的官方文档,来介绍 COUNT() 函数的使用,以及 COUNT(列名)、COUNT(1) 和 COUNT(*) 的区别,还有 MySQL 对 COUNT() 函数进行了哪些优化。正文在 MySQL 关于优化的文档中,在 WHERE Clause Optimization 章节,有这样一段话:C
2020-10-17 15:26:21
606
原创 OpenFeign学习(十):Spring Cloud OpenFeign 集成 Ribbon,Eureka 实现请求负载均衡流程解析
说明通过之前的博文,我简单介绍了 Spring Cloud OpenFeign 的使用方式及加载配置原理,以及在脱离 Eureka 的情况下使用 Ribbon 以及 Spring Cloud Ribbon 的加载配置原理。通过这些内容我们简单了解到了 OpenFeign 和 Ribbon 的使用方式以及 Spring Cloud 是如何对这些组件进行集成加载配置的。本篇博文,我将继续通过源码来简单介绍 Spring Cloud OpenFeign 在集成 Eureka,Ribbon 后如何实现自动请求负
2020-10-05 19:40:46
998
原创 Ribbon 学习(三):RestTemplate 请求负载流程解析
说明在上篇博文《Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理》中,我简单介绍了 Spring Cloud Ribbon 的加载配置原理及 RestTemplate 使用 @LoadBalanced 注解后实现请求负载的具体原因 ---- 通过 LoadBalancerInterceptor 拦截器进行了请求服务地址的负载。在本篇博文中,我将通过源码来解析 RestTemplate 在发出请求后到响应的整体流程,来探究 Ribbon 在其中的作用原理。本篇博文仍基于之前博
2020-09-06 15:41:52
475
原创 Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
说明在上一篇博文《Ribbon 学习(一):脱离 Eureka 使用 Ribbon》一文中,我简单介绍了在脱离 Eureka 时 Ribbon 的简单使用方式。在本篇博文中,我将继续通过源码来介绍 Spring Cloud Ribbon 的加载配置原理,了解 Ribbon Client 如何创建,以及 RequestTemplate 如何具有负载均衡的功能特性。在正文开始前,我们先回忆下在上篇博文中是如何使用 Ribbon 的。首先使用 @LoadBalanced 注解标注创建了 ResetTempla
2020-08-29 19:06:35
4187
原创 Ribbon 学习(一):脱离 Eureka 使用 Ribbon
说明在之前的博文中,我介绍了OpenFeign 的使用及 Spring Cloud 集成 OpenFeign 后的使用和配置原理,并没有涉及到其他如负载均衡,服务降级等内容。在本篇博文中,我将简单介绍 Ribbon 的使用方式,通常 Ribbon 的使用都是在 Spring Cloud 体系中通过 Spring Cloud OpenFeign 集成 Ribbon 和 Eureka,实现了服务发现和负载均衡的无感使用。本篇博文将脱离 Eureka,手动配置服务列表来演示 Ribbon 的简单使用。正文引
2020-08-15 21:22:11
1410
原创 OpenFeign学习(九):Spring Cloud OpenFeign的加载配置原理 II
说明在上篇博文《OpenFeign学习(八):Spring Cloud OpenFeign的加载配置原理》中,我简单介绍了Spring Cloud 是如何通过注解对Feign Client进行加载配置的。主要介绍了通过FeignClientsRegistrar类,对所有使用@FeignClient注解的类进行加载配置,实现Feign Client的配置类Bean的注册和相对应Client的FeignClientFactoryBean的注册。同时还提到在spring.factories配置文件中,配置了有关
2020-07-04 20:28:24
1553
原创 OpenFeign学习(八):Spring Cloud OpenFeign的加载配置原理
说明在上篇博文《OpenFeign学习(七):Spring Cloud OpenFeign的使用》中,我介绍了Spring Cloud OpenFeign的简单用法。在本篇博文中,我将继续对Spring Cloud OpenFeign进行学习,通过源码介绍Spring Cloud是如何对OpenFeign进行集成支持,如何进行加载配置。正文注解的使用在阅读源码前,我们先通过文档简单了解下Spring对OpenFeign进行了那些扩展支持:Spring Cloud adds support for
2020-06-29 22:57:09
1424
原创 OpenFeign学习(七):Spring Cloud OpenFeign的使用
说明通过之前的几篇博文,我简单介绍了OpenFeign的使用及其工作原理。OpenFeign的易用性和扩展性让人印象深刻。接下来,我将继续学习Spring是如何对OpenFeign进行集成支持,使其在Spring Cloud 微服务体系中发挥着重要的作用。在本篇博文中,我将结合官方文档介绍Spring Cloud OpenFeign,了解其基本使用方式及功能特性。进行服务间的调用无外乎HTTP请求或者RPC调用,在Spring Cloud 微服务体系中也支持了这两种方式。分别是以HTTP请求为基础的Sp
2020-05-31 23:45:53
4735
1
原创 OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
说明在之前的博文《OkHttp的高级封装Feign学习(一): Feign注解的使用》中,我简单介绍了OpenFeign的使用方式。其中在请求传递参数时,可以使用@Param和@QueryMap注解。本篇博文我将介绍学习如何使用OpenFeign进行表单参数提交或者传输文件。正文我们先看下之前示例中只使用@Param和@QueryMap的局限性:@Param注解用来解析其他注解中的参数表达式,一般用于restful风格的请求方式中。@QueryMap注解则是用来定义参数的Map集合或者是POJO。这
2020-05-16 18:34:38
9874
原创 OpenFeign学习(五):OpenFeign请求结果处理及重试控制
#说明在上篇博文《OpenFeign学习(四):OpenFeign的方法同步请求执行》一文中,我对OpenFeign的同步请求的执行的原理进行了介绍和学习。本篇博文我将继续通过源码对请求之后结果的封装解码及失败重试进行介绍和学习。正文在上篇博文中提到,OpenFeign通过SynchronousMethodHandler进行同步方法请求处理,在介绍executeAndDecode方法源码时,...
2020-04-25 15:32:26
5039
原创 OpenFeign学习(四):OpenFeign的方法同步请求执行
说明在上篇博文《OpenFeign学习(三):OpenFeign配置生成代理对象》中,我对OpenFeign的整体工作流程做了简单的介绍,并且通过源码,介绍学习了OpenFeign配置创建代理对象的原理。在本篇博文中,我将继续通过源码对OpenFeign的方法请求工作流程的原理进行介绍学习。正文在阅读请求部分的源码前,我们先回顾下上篇博文的内容,包括OpenFeign的整体工作流程图和配置创...
2020-04-19 16:32:58
3483
原创 OpenFeign学习(三):OpenFeign配置生成代理对象
说明在之前的两篇博文《OkHttp的高级封装Feign学习(一): Feign注解的使用》和《OpenFeign学习(二):高级用法自定义配置组件HttpClient / SLF4J / RequestInterceptor等》中,我简单介绍了OpenFeign的使用方法。在本篇博文中,我将通过源码来学习记录OpenFeign的工作原理。正文工作流程在阅读源码前,我们先通过流程图来了解Op...
2020-04-06 16:39:34
2386
原创 RabbitMQ学习(二十一):使用消息有效期TTL和死信路由DLX实现消息延迟重试消费的限制
说明在之前的一篇博文《springboot学习(十三):RabbitMQ的使用 实现消息延迟消费》中,我简单介绍了使用Rabbitmq的消息有效期和死信路由的特性实现消息的延迟消费。在后续的使用中,希望通过这两种特性实现针对消息自定义过期时间实现延迟消费,但是发现Rabbitmq并不支持。本篇博文将对使用中出现的问题进行总结记录。正文在之前延迟消费一文的示例代码中,每个消息都设置了5s的有效...
2020-03-29 15:08:56
1498
原创 OpenFeign学习(二):高级用法自定义配置组件HttpClient / SLF4J / RequestInterceptor等
说明在项目开发中,避免不了通过HTTP请求进行对第三方服务的调用,在上篇博文OkHttp的高级封装Feign学习(一): Feign注解的使用中,我对Feign注解基本使用进行了学习总结。本篇博文我将继续对feign的其他特性及高级用法进行学习总结。正文feign具有很强的扩展性,允许用户根据需要进行定制,如HTTP客户端OkHttp, HTTP/2 client, SLF4J日志的使用, ...
2020-02-26 22:56:18
3523
原创 OkHttp的高级封装Feign学习(一): Feign注解的使用
说明在项目开发中,避免不了通过HTTP请求进行对第三方服务的调用,在之前的两遍博文《OkHttp使用踩坑记录总结(一):OkHttpClient单例和长连接Connection Keep-Alive》和《OkHttp使用踩坑记录总结(二):OkHttp同步异步请求和连接池线程池》中,我对OkHttp使用过程中遇到的一些问题进行了总结记录。在微服务架构体系中,我们通常使用netflix开源的sp...
2020-02-23 22:54:57
3672
原创 OkHttp使用踩坑记录总结(二):OkHttp同步异步请求和连接池线程池
说明在项目中对第三方服务的调用,使用了OkHttp进行http请求,这当中踩了许多坑。本篇博文将对OkHttp使用过程遇到的问题进行总结记录。正文同步请求SyncRequest 异步请求AsyncRequest通过简单示例了解OkHttp如何进行http请求:SyncRequest:private static void syncRequest(String url) throws ...
2020-01-20 17:57:36
18496
原创 OkHttp使用踩坑记录总结(一):OkHttpClient单例和长连接Connection Keep-Alive
说明在项目中对第三方服务的调用,使用了OkHttp进行http请求,这当中踩了许多坑。本篇博文将对OkHttp使用过程遇到的问题进行总结记录。正文OkHttpClient 单例在刚开始使用时,没有将OkHttpClient单例化,造成的后果就是服务器OOM异常,can’t create native thread…为什么会出现OOM,提示无法创建本地线程?通过查看资料文档发现,每个cl...
2020-01-20 17:02:52
41788
9
原创 EasyExcel使用总结(一):写Excel
说明最近有很多数据要处理,需要导出Excel表格。在使用POI时发现非常耗内存,在GitHub上发现阿里开源的Easy Excel项目,基于java的读写Excel,十分省内存。本篇博文主要是总结记录了使用EasyExcel进行写Excel的方法。正文引入依赖在pom.xml文件引入easyexcel依赖,我使用的是2.1.4版本,目前最新是2.1.6。<dependency>...
2020-01-11 21:46:02
26393
6
原创 写在2019年末
19年的最后两天,北京真的好冷。又到了年底总结的时候。脑袋里把19年的事情,像电影一样回放了一遍,发现并没有像18年那样,有很多记忆深刻的东西。从18年毕业转正到现在,算上实习,工作了已经有20个月又10天。工作后,最大的感触就是时间太快了,人生太艰难了。先把19年的流水账记下吧。首先,工作上今年的加班比去年多了,但是相较于业内的996,加班这块还是比较幸福的。从实习到现在,公司上的业务也熟悉...
2019-12-31 21:31:39
711
2
原创 Array.asList()踩坑记录之java.lang.UnsupportedOperationException
说明本篇博文主要记录了在使用Arrays.asList()方法时遇到的问题,并通过源码了解其背后的原理。正文问题描述:在将Arrays.asList()方法生成的list集合,作为参数传递到方法中,但在运行中出现了一下bug。java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList...
2019-12-27 23:39:09
737
原创 Apollo学习(六):自定义Meta Server地址定位逻辑
说明在之前的一篇博文《Apollo学习(二): Java客户端使用》中,我简单地总结了Apollo配置中心的java客户端使用方法,其中有几个重要步骤,如确定项目的AppId,设置Meta Server的地址,设置本地缓存路径的地址等。在之前的博文中,对Meta Server地址的设定是通过项目内的app.properties配置文件和系统配置环境参数来进行设置的,这种方式在实际使用中,有很多...
2019-11-30 21:02:33
5722
8
原创 Apollo学习(五):docker容器化分布式部署
说明在之前的文章《Apollo学习(三): 分布式部署》中,我简单介绍了在Windows环境下,实现Apollo配置中心的分布式部署。本篇博文我将对如何实现Apollo的docker容器化分布式部署的步骤进行记录总结。正文目的根据源码定制安装包,修改默认端口,日志输出地址、等级,jvm等参数的默认值使用独立的docker部署的注册中心集群使用容器化部署的MySQL数据库容器化部署A...
2019-11-24 21:03:54
2526
翻译 RabbitMQ学习(二十):消费者优先级和优先级队列
说明在之前的博文中我对RabbitMQ的一些扩展特性进行了翻译学习,本篇博文我将继续翻译学习RabbitMQ的消费者优先级(Consumer Priorities)和优先级队列(Priority Queues)相关内容。正文消费者优先级(Consumer Priorities)消费者的优先级可以确保在不同优先级消费者都活跃消费消息时,高优先级的消费者会首先接收消息,只有在高优先级的消费者阻...
2019-10-27 21:40:09
2092
原创 Kafka学习(一):消费者实现对分区的并发消费
说明在上篇博文《springboot学习(十七):了解spring - kafka配置工作原理》中,我们简单了解了spring-kafka的配置工作原理。通过源码可以看到spring在实现并发消费时,采用的是线程封闭的策略,也就是一个groupid中,根据配置的concurrency来创建多个消费者线程,每个消费者消费一个或多个分区,来实现整个topic消息的消费处理。本篇博文将对上篇博文中最后...
2019-10-20 15:00:11
9541
原创 springboot学习(十七):了解spring - kafka配置工作原理
说明在上篇博文《springboot学习(十六):了解springboot自动装配kafka原理》中,我对springboot自动装配kafka的原理进行了简单介绍,在文末说到springboot通过初始化配置类org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration实现了对kafa的自动装配。而该类又通过注解间接引入...
2019-10-03 14:39:18
3968
原创 springboot学习(十六):了解springboot自动装配kafka原理
说明在上篇《springboot学习(十五):Kafka的使用》博文中,通过简单的示例介绍了如何在springboot项目中使用kafka。代码十分简单,通过配置文件和注解就可以操作kakfa集群。本篇博文将通过springboot的源码来了解springboot如何自动装配kafka。创建SpringApplication从程序启动入口入手阅读代码:@SpringBootApplica...
2019-09-23 17:27:33
4391
原创 springboot学习(十五):Kafka的使用
说明本篇博文主要介绍在springboot中使用kafka,以及如何配置kafka。正文简单配置spring kafka提供了spring对kafka的支持,通过简单的配置我们可以快速使用KafkaTemplate进行消息的发送,使用@KafkaListener注解来进行消息消费。以下内容,通过简单的配置,实现在springboot中快速使用kafka.配置文件server: po...
2019-09-07 19:20:51
1132
翻译 RabbitMQ学习(十九):消费者的未确定消息数限制(Consumer Prefetch)
说明在之前的博文《RabbitMQ学习(十七):消息确认之消费者确认模式 II》中,我对有关消费者确认模式进行了翻译学习,其中提到了对通道Prefetch Count设置及该值对吞吐量的影响。本篇博文将继续翻译学习如何设置通道的Prefetch Count,及方法参数不同值的不同含义。正文概述在AMQP 0-9-1协议中定义了basic.qos方法,通过该方法可以设置消费者在消费时通道(或...
2019-08-24 16:54:41
2479
翻译 RabbitMQ学习(十八):消息确认之发送者确认模式
说明通过之前的两篇博文《RabbitMQ学习(十六):消息确认之消费者确认模式 I》和《RabbitMQ学习(十七):消息确认之消费者确认模式 II》,对消费者确认模式进行了翻译学习,本篇博文将继续翻译学习文档的最后一部分,有关发送者确认模式的内容。内容包含了服务器如何对生产者发送的消息进行确认,消息确认的时机,确认消息的顺序等内容。正文发送者确认网络可能一些不明显的原因发生故障,并且检测...
2019-08-11 17:56:23
1268
翻译 RabbitMQ学习(十七):消息确认之消费者确认模式 II
说明在上篇博文《RabbitMQ学习(十六):消息确认之消费者确认模式 I》中对消息确认的必要性和确认相关的传输标签,消费者确认方法等内容进行了翻译学习,本篇博文我将继续翻译学习消息者确认模式的剩余内容,主要包含了积极消极确认的方式,批量确认消息,通道Prefetch值的设置以及它和确认模式对吞吐量的影响,还有异常时的自动重新入队,客户端常见错误等内容。正文积极确认在客户端包中对消息进行确...
2019-08-04 15:58:36
1548
翻译 RabbitMQ学习(十六):消息确认之消费者确认模式 I
说明通过上篇博文《RabbitMQ学习(十五):消极确认》我们初步了解了消费者对消息确认的相关内容,通过消极确认,消费者可以拒绝一个消息。本篇博文,我将继续翻译学习官方文档中关于消息确认的相关内容。由于原文档太长,本篇博文只翻译消费者确认的部分内容。通过本篇博文,我们将了解到消息确认机制的意义,消息确认的不同模式,消息确认对吞吐量的影响等内容。概述消息者确认机制和发送者确认机制对数据安全十分...
2019-07-27 17:37:52
1526
原创 线上异常处理(一): 线程堆积导致OOM, RabbitMQ的Connection中自动创建线程池
说明本篇博文主要记录之前线上项目由于线程数过多导致内存泄露后,事故原因的分析排查过程。项目背景是其中使用了公司封装的管理类来操作RabbitMQ。正文初步猜想项目出现oom后发现是线程数过多导致内存泄露,快速进行了重启。重启后,仍发现线程数在不断地增长。 查看代码发现,在从mq获取到消息后会进行http请求调用其他服务。查看工具类,发现每次请求都会新建CloseableHttpClient...
2019-07-21 16:18:16
3265
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人