- 博客(75)
- 收藏
- 关注
原创 【Redisson 加锁源码解析】
Redisson 的分布式锁实现基于 Redis + Lua 脚本,解决了互斥、可重入和死锁问题。看门狗续期机制是 Redisson 的亮点,保证了业务执行时间不可预测的情况下的安全性。在生产环境中,Redisson 的分布式锁相较于的手写版本,更加健壮和可靠。
2025-08-30 12:55:02
1122
原创 【如何使用Redis实现分布式锁详解讲解】
要实现使用Redis实现一个分布式锁不是简单的使用setnx命令就可以实现的,还需要从可重入性死锁避免、解锁时候释放的是自己锁而不是其他线程的、业务还在执行锁时间过期,锁释放,需要保证锁续期机制。以及集群模式,如何保证Redis宕机后在其他 Redis 实例中锁还是存在的问题。多个Redis命令都是通过 Lua 脚本保证各个操作的原子性,防止出现线程安全问题。ownerId + Hash 计数保证可重入性TTL + 看门狗避免死锁解锁前校验 ownerId 保证安全性周期续期机制应对长业务执行。
2025-08-24 14:55:00
1346
原创 【全网Spring核心后置处理器:ConfigurationClassPostProcessor 最详细解析】
是一个BeanFactory后置处理器,它实现了接口(同时继承了接口)。其主要功能是参与BeanFactory中BeanDefinition的操作和属性值修改,专门用于解析各种配置注解。ConfigurationClassPostProcessor是Spring框架注解驱动编程的核心组件,它负责处理各种配置注解,并注册相应的Bean定义。更好地理解Spring容器的启动过程:明确配置类是如何被识别和处理的编写更高效的配置类:根据需求选择Lite模式或Full模式避免常见的配置陷阱。
2025-08-22 17:43:03
1152
原创 【Spring Boot刷新上下文核心流程详解】
在使用 Spring Boot 启动应用时,控制台会打印出一大串日志,其中最核心的启动动作之一就是刷新上下文(refresh)。refresh方法不仅负责 Bean 的创建与初始化,还涉及监听器、国际化、多环境配置等多个模块,是 Spring Boot 启动的核心环节。本文将结合源码,带你从入口到细节剖析刷新上下文的全过程。refresh()就像 Spring Boot 启动的总指挥,控制了从配置准备 → BeanFactory 构建 → Bean 创建 → 事件发布的全流程。
2025-08-10 12:40:00
1050
原创 【Spring Boot启动流程底层源码详解】
这个流程确保了Spring Boot应用的完整启动,从注解解析到Bean创建再到应用就绪,每个步骤都有明确的职责和执行时机。执行所有的ApplicationRunner和CommandLineRunner。3、new SpringApplication()对象。5、SpringApplicationshi实例。2、继续调用静态方法。
2025-08-09 00:54:17
1453
原创 深入理解 ReentrantLock和AQS底层源码
特性说明可中断使用可响应中断,避免死锁可超时使用限时获取锁可重入同一线程可以多次获取同一把锁,不会死锁支持公平锁构造函数传入true实现公平加锁条件变量支持可使用实现类似的线程通信机制特性可重入✅✅响应中断❌✅可超时❌✅公平/非公平选择❌✅ 可选条件变量一个支持多个Condition性能较低,受限于 JVM 实现高,适合复杂并发逻辑。
2025-08-07 23:16:41
663
原创 Spring Boot 自动配置底层源码实现详解
本文深入源码,完整剖析 Spring Boot 自动装配背后的实现逻辑,适合有一定基础的开发者查漏补缺、面试复习。
2025-07-25 12:28:57
957
原创 【JVM 常用工具命令大全】
本文介绍了Java性能调优的常用工具及实用技巧。主要内容包括:1)图形化工具JConsole和VisualVM的功能与使用;2)命令行工具jstat、jstack、jmap、jinfo的详细参数和使用示例;3)组合使用技巧及生产环境注意事项,如高CPU分析流程、内存泄漏排查方法等。这些工具可帮助开发者监控JVM运行状态、分析线程堆栈、检测内存问题,并提供了生产环境下的最佳实践建议,如避免STW、多次线程dump等关键操作要点。
2025-09-20 18:45:22
478
1
原创 【Sa-Token 中 三种Session会话 模型详解】
Sa-Token会话模型解析:三种Session结构详解 本文深入解析Sa-Token框架中的三种会话模型:Account-Session(基于用户ID的全局会话)、Token-Session(基于Token的独立会话)和Custom-Session(自定义业务会话)。Account-Session实现多端数据同步,Token-Session管理独立登录会话,Custom-Session支持业务维度数据存储。三种模型分别适用于用户全局信息、单次登录上下文和业务实体数据等不同场景,通过灵活的会话管理解决了传统
2025-09-16 23:28:26
1421
原创 JVM 自定义类加载器与打破双亲委派机制详解
本文深入解析了JVM自定义类加载器与双亲委派机制。首先回顾了双亲委派的标准流程,即先检查是否已加载,再依次委托父加载器,最后才由自己加载。然后介绍了两种自定义ClassLoader的方式:常规方式仅重写findClass(),而打破双亲委派则通过重写loadClass()改变加载顺序。文章详细说明了自定义加载器的实现步骤,包括如何从特定路径加载类字节码,以及如何通过修改loadClass()方法实现"自己优先"的加载策略。最后列举了典型应用场景如Web容器、热部署和类隔离,并提醒了类唯一
2025-09-14 00:39:00
716
原创 Java 面向对象设计的六大原则
本文介绍了Java面向对象设计的六大原则:1)单一职责原则(一个类只做一件事);2)开闭原则(通过扩展而非修改实现功能变更);3)里氏替换原则(子类可替换父类);4)依赖倒置原则(面向接口编程);5)接口隔离原则(使用多个小接口);6)迪米特法则(减少对象间的依赖)。这些原则通过代码示例说明,旨在提高代码的可维护性、扩展性和复用性,建议开发者灵活运用这些原则来构建更健壮的Java项目。
2025-09-13 21:19:29
507
原创 Spring Boot 的注解是如何生效的
注册是一个分层处理的过程。下面我们以 @Configuration。同时,递归处理和缓存机制解决了复杂依赖和性能问题。为例,结合代码流程详细说明其从扫描到注册的完整逻辑。注册分离,确保了灵活性和扩展性(如支持动态。Spring 对配置类注解的处理是一个。:递归解析每个候选配置类的注解。这种设计将注解元数据解析与。等注解的扫描、解析和。在 Spring 中,
2025-09-09 22:52:25
1232
原创 SpringBoot注解生效原理分析
Spring Boot 的注解(如 @RestController、@Service、@Autowired、@Configuration 等)在开发中使用非常广泛,但它们为什么能“自动生效”?本文将深入解析其背后的原理。Spring 注解的生效依赖于 Spring 容器(ApplicationContext) 和 注解处理器(BeanPostProcessor / ConfigurationClassPostProcessor 等)。
2025-09-03 20:30:07
572
原创 【深入解析——AQS源码】
AQS(AbstractQueuedSynchronizer)是Java并发编程的核心组件,为ReentrantLock、Semaphore等并发工具提供底层支持。其核心设计包含:1)volatile state变量表示同步状态;2)CLH双向队列管理等待线程;3)采用模板方法模式,将tryAcquire/tryRelease等具体实现交由子类完成。源码分析揭示了独占模式(如ReentrantLock)和共享模式(如CountDownLatch)的不同实现机制,重点关注acquire流程、Node节点结构及
2025-08-30 18:40:29
720
原创 【一篇文章快速讲清楚:BeanFactoryPostProcessor和BeanPostProcessor的区别和联系】
的作用是在 Spring 容器加载了所有 Bean 的定义()之后,但在创建 Bean 实例(即)之前,对 Bean 的定义信息进行修改或干预。为了更直观地理解它的定位和工作时机,可以通过下面的流程图来看它在整个Spring容器启动过程中的关键位置:fill:#333;color:#333;color:#333;fill:none;Spring容器启动加载配置文件/注解解析为BeanDefinition执行所有BeanFactoryPostProcessor修改BeanDefinition。
2025-08-22 17:37:35
931
原创 【BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor 详细解答】
实际上是的一个特殊化和功能更强的子接口。在 Spring 的 IoC 容器中,Bean 的定义(BeanDefinition) 与 Bean 的实例化 是两个阶段。而 BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor 正是介入这两个阶段的重要扩展点,开发者可以通过它们对 Spring 的 Bean 定义或 BeanFactory 进行定制化。是“征兵官”,负责招募新士兵(注册新的BeanDefinition)。是“训练官”
2025-08-22 17:24:07
1103
原创 【一篇文章快速讲清楚:BeanDefinition和BeanDefinitionRegistry】
区别:它们是截然不同的概念。是数据,而是存储和管理数据的容器。联系是 BeanDefinition的持有者和管理者。没有Registry,BeanDefinition就无处存放;而没有BeanDefinition,Registry就是一个空壳。常见实现最最重要的实现类是 DefaultListableBeanFactory,它是Spring核心中的核心。的常用实现类是等。简单来说,BeanDefinitionRegistry是舞台,是台上的演员,Spring容器()则是导演,它协调整个演出过程。
2025-08-22 13:06:44
673
原创 【元空间(Metaspace)和方法区(Method Area)关系】
方法区 就像是“仓库管理部门”的职责规定(规定要管好库存、记录、档案)。永久代 是旧经理,他在公司总部(JVM内存)划了一块固定大小的区域(PermGen) 来存放档案。元空间 是新上任的经理,他改革了方案,直接把档案室搬到了公司外面一个几乎无限大的仓库(本地内存)里,并且管理方式更智能。所以,当你被问到“元空间和方法区有什么区别”时,可以这样回答:“方法区是JVM规范中定义的一块逻辑区域,用于存储类信息、常量等数据。而元空间是HotSpot虚拟机在JDK 8之后对方法区规范的具体实现。
2025-08-21 12:04:08
1089
原创 AQS(AbstractQueuedSynchronizer)底层源码实现与设计思想
AQS是Java中一个抽象同步器框架,利用一个int类型的状态变量表示同步状态,并通过一个基于FIFO的双向队列来管理因获取同步状态失败而等待的线程。AQS为我们封装了复杂的线程排队和唤醒逻辑,子类只需关注如何修改同步状态,实现自定义同步器。核心点说明state变量用于表示同步资源状态,CAS操作保证原子性FIFO等待队列基于双向链表,维护线程的公平等待和唤醒顺序独占与共享模式支持多种同步策略,扩展性强模板方法设计子类实现具体同步逻辑,AQS负责线程排队和阻塞管理高效的线程挂起与唤醒机制。
2025-08-10 19:22:59
981
原创 【继承之向上转型、向下转型与动态绑定的实践与深入讲解】
在Java面向对象编程中,继承、向上转型、向下转型以及动态绑定是极为重要的核心概念。它们共同构建了多态机制的基石,帮助我们编写灵活、可扩展且易维护的代码。本文将通过示例代码,结合理论,带你系统理解这几个概念的关系与应用。
2025-08-10 14:45:37
421
原创 【Spring IoC 核心实现类详解:DefaultListableBeanFactory】
核心类职责:保存 BeanDefinition、注册 BeanDefinition、创建 Bean、依赖注入、生命周期管理关系只是更高级的外观模式,底层真正管理 Bean 的还是。
2025-08-10 14:29:43
802
原创 ConcurrentHashMap源码详解
是Java集合框架中提供的线程安全的哈希表实现,与Hashtable和不同,它采用了更细粒度的锁机制,实现了更高的并发性能。的put方法展现了Java并发编程的精妙设计,通过CAS、volatile和细粒度锁的组合,实现了高并发下的线程安全与性能平衡。理解其实现原理,有助于我们编写更高效、更可靠的并发代码。
2025-08-04 20:13:31
845
原创 Seata实战
TM开启全局事务并生成 XID。RM注册分支事务并绑定 XID。TM发起全局提交或回滚请求。TC决定并协调所有分支的最终执行。RM根据指令完成资源的提交或回滚。
2025-08-03 16:53:37
1167
原创 RocketMQ入门实战详解
RocketMQ 是一个成熟的分布式消息中间件,适合构建高性能、解耦、可靠的消息系统。通过本文的实战入门,相信你已经能掌握基础使用方式,并可以在实际项目中灵活落地。顺序消息延时消息事务消息多 Broker 集群部署消息追踪与监控。
2025-07-28 18:12:54
387
原创 《高并发优化方案一》:本地锁 + 分布式锁解决高并发下获取锁造成Redis网络抖动问题
本地锁 + 分布式锁是一种性能与安全兼顾的高并发控制策略。正确的锁粒度、锁对象复用和生命周期管理,是该策略能否成功落地的关键。多级锁是构建高可用电商/交易系统的基础能力之一。
2025-07-21 20:54:06
1004
原创 JVM调优参数详解及实践指南
Xms(初始堆大小):JVM启动时分配的初始内存-Xms1g-Xmx(最大堆大小):JVM可使用的最大内存-Xmx4g。
2025-07-14 10:28:00
1181
原创 JVM 常用工具命令大全
定义:在JVM中主要有命令行工具和对应的图形化工具,命令行工具较为简单直接操作,图形化更容易通过一个可视平台去观看其中JVM信息的情况。二者都有其独特之处。
2025-07-14 00:30:33
511
原创 try-catch-finally输出先后顺序的机制
2、如果 finally 没有返回值 只是有一段处理逻辑,在执行到return 语句时候 会先执行finally块里面代码的逻辑,然后才会返回return 之后的逻辑。1、如果try、catch、finally分别都有返回值时候,最终finally的返回值会覆盖他们两个中的其中一个。一但遇到return语句之后就会先执行 finally 代码块里面的逻辑,如果。,反之则是之前的代码块中的 return 作为结果返回。
2025-07-12 15:44:13
171
原创 Spring事务传播
事务传播(Propagation)定义了一个事务方法被另一个事务方法调用时,事务应该如何传播(合并、挂起、创建新事务等)。**简单来说:**当一个事务方法 A 调用事务方法 B,B 是否要加入 A 的事务?还是自己新建一个事务?或者不使用事务?
2025-05-18 17:48:25
457
原创 Java父类、子类实例初始化顺序详解
可知通过继承时候,当加载子类时候会优先加载父类,等父类全部加载完毕才会进行子类的加载,静态变量特殊,如果。父类实例变量默认值 → 父类实例变量显式赋值 + 父类实例代码块(按代码顺序执行)→ 父类构造函数。子类实例变量默认值 → 子类实例变量显式赋值 + 子类实例代码块(按代码顺序执行)→ 子类构造函数。父类静态变量默认值 → 父类静态变量显式赋值 + 父类静态代码块(按代码顺序执行)。子类静态变量默认值 → 子类静态变量显式赋值 + 子类静态代码块(按代码顺序执行)。3、父类的实例初始化。
2025-04-30 18:59:13
444
原创 Spring中事务失效的原因详细解析
在 Spring Boot 中,通常会自动扫描 @Service、@Repository 等注解标注的类,但如果配置不正确,可能会导致扫描失败。原因:Spring 的事务是基于线程绑定的,每个线程都有自己独立的事务上下文。如果在一个带有事务的方法中开启了新的线程进行数据库操作,新线程中的操作不会参与到原线程的事务中,即使原线程的事务出现异常回滚,新线程中的操作也不会回滚。如果没有正确配置事务管理器,或者在使用 @Transactional 注解时没有指定正确的事务管理器,事务将无法正常工作。
2025-03-04 17:34:16
918
原创 HttpServletRequest、ServerHttpRequest 和 ServerWebRequest作用详解
适用于传统的 Servlet 应用(如 Spring MVC)。适合阻塞式 I/O 的场景。适用于响应式 Web 应用(如 Spring WebFlux)。适合非阻塞式 I/O 的场景。适用于响应式 Web 应用(如 Spring WebFlux)。提供了更高级的 API,封装了 ServerHttpRequest 和 ServerHttpResponse。如果你使用的是传统的 Spring MVC,选择 HttpServletRequest。
2025-03-04 16:54:05
1372
原创 汇总项目总结
⼀个基于微服务的OJ系统,具备能够根据管理员预设的题⽬⽤例对⽤⼾提交的代码进⾏执⾏和评测的能⼒。此外,还⾃主实现了代码沙箱,可作为独⽴服务供其他开发者调⽤。⼀个在线刷题平台,平台⽀持管理员创建题库、批量管理题⽬,⽤⼾可以通过⾼效的搜索引擎进⾏题⽬检索,在线做题。项⽬核⼼围绕性能优化、数据⼀致性和⾼并发场景进⾏设计, 确保⽤⼾的刷题体验流畅且稳定。实现了伙伴交流聊天室、按共同兴趣爱好标签检索伙伴、推荐相似伙伴、组队,聊天,ChatGPT问答等功能。
2025-02-11 23:27:39
2156
原创 如何保证Redis和MySQL数据的一致性刨析
由缓存的调用者在进行更新数据库的同时更新缓存。更新数据:在进行数据库数据修改的时候,一般都是删除缓存,然后缓存为空,等待查询时候判空再进行数据库的查询然后更新缓存,而不是每次去做更新数据都进行更新缓存操作。
2025-02-10 22:44:07
843
原创 Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?
拦截器(Interceptor): 只会拦截那些被@Controller 或 @RestController 标注的类中的方法处理的请求,也就是那些由 Spring MVC 调度的请求。过滤器(Filter): 会拦截所有类型的 HTTP 请求,包括静态资源和后台 API。Controller 是 Spring MVC 的核心组件之一,用于处理用户的 HTTP 请求,并返回响应。请求会根据 URL 路径、请求方法(GET/POST) 等信息,映射到 Controller的某个方法上来处理。
2025-02-10 16:24:09
735
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅