为了方便动态调整线程池参数,将线程池参数的配置放到配置中心中,比如 Nacos,Apollo。 在七个线程池参数中,corePoolSize(核心线程数),maximumPoolSize(最大线程数),workQueue(阻塞队列),handler...
CompletableFuture 的统一异常处理及超时处理
背景 项目中需要调用多个服务,如果使用 open-Feign 串行化调用,响应时间可能会比较长,后续使用了 CompletableFuture 和线程池进行异步调用,但是在调用时,可能存在调用的服务报错,导致整个查询方法直接抛出...
Redis 底层数据结构源码剖析
背景介绍 一直好奇为什么 Redis 处理速度这么快,很大部分是因为数据结构设计的好,所以学习一下 Redis 数据结构的底层实现。 Redis 发展到现在已经有 9 种数据类型了,其中最基础、最常用的数据类型有 5 种,它...
为什么不在 ForkJoinPool 中使用虚拟线程?
刚才看到一张帖子提到为什么在 ForkJoinPool 中不使用虚拟线程? 在 JDK 21 中进行测试 public static void main(String[] args) throws InterruptedException { Runnable task = () -> { System....
【需求变更】使用 Redis 和 Lua 脚本实现变更后方案编号的生成
项目有部分需求变更,比如之前使用的 MyBatis-plus 封装的雪花算法,但现在一些业务比如某些方案编号,需要以特定格式生成,现在文件编号要求以 年-月-4位序号 的格式生成,当年或月变化时,4位序号需要重置,比...
【BUG】声明式事务失效导致日志记录失败
发生背景 我们知道在这种场景下事务会失效 被@Transactional 注解修饰的事务方法权限修饰符只能是 public,否则事务会失效 当前类中的方法不能调用事务方法,否则事务失效 然而项目中有一段向数据...
SPI机制详解【JDK vs Dubbo 】
SPI SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正...
ReentrantLock底层原理
ReentrantLock public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } ReentrantLock 的默认实现是非公...
AQS实现原理
AQS(AbstractQueuedSynchronizer)是一个用于构建锁和同步器的框架,许多同步器都可以通过AQS很容易并且高效地构造出来。 不仅 ReentrantLock 和 Semaphore 是基于AQS构建的,还包括 CountDownLatch、Reentrant...
【设计模式】设计模式的分类
通常设计模式的分类有创建型、行为型和结构型。 创建型 常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。 不常用的有:原型模式。 创建型模式涉及到将对象实例化,这类模式都提供一个方法,...