- 博客(24)
- 收藏
- 关注
原创 详解CountDownLatch底层源码
总结一下,CountDownLatch 本身就是通过 AQS 的 state 公共变量维护一个计数器。调用 await() 方法,就是把当前线程加入到阻塞队列,直到 state 变量为 0。调用 countdown() 方法,就是对 state 变量减一,如果减到0了,那么就唤醒阻塞队列的所有线程。它只能一次性使用,无法重置计数。如果需要多次使用 CountDownLatch,必须新建实例,不如 CyclicBarrier 可以复用。今天的分享就到这里了。关注我吧,我是此林,带你看不一样的世界!
2025-03-29 23:06:10
696
原创 从 JVM 源码(HotSpot)看 synchronized 原理
大家好,我是此林。不知道大家有没有这样一种感觉,网上对于一些 Java 框架和类的原理实现众说纷纭,看了总是不明白、不透彻。今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全文以的模式来展开讲述,方便大家理解。
2025-03-03 17:08:28
1149
原创 浅析 Redis 分片集群 Cluster 原理、手动搭建、动态伸缩集群、故障转移
可以发现,分片集群有以下特征:1. 集群中有多个master,每个master保存不同数据2. 每个master都可以有多个slave节点3. master之间通过心跳机制监测彼此健康状态4. 客户端请求可以访问集群任意节点,最终都会被路由转发到正确节点可以发现,Cluster 集群里面没有了哨兵机制,而是不同 master 之间通过心跳机制互相检测彼此的健康状态,如果发现有 master 宕机,会和哨兵一样重新选 master ,进行故障转移。
2025-02-26 15:21:45
1116
原创 浅谈 Redis 主从复制原理(二)
大家好,我是此林。上一篇文章中,说到了 Redis 主从复制的全量同步和增量同步,repl_baklog 复制缓冲区,以及 slave 挂掉之后数据同步的措施。下面介绍的上一篇遗留问题,主节点 master 宕机了,怎么办?
2025-02-21 15:12:00
828
原创 浅谈 Redis 主从集群原理(一)
大家好,我是此林。在生产环境上,Redis 一般都不会单节点部署,是 Redis 集群部署的一种方案。下面是 Redis 主从集群的一种最简单的方式。
2025-02-21 15:05:18
700
原创 详解单例模式、模板方法及项目和源码应用
大家好,我是此林。设计模式为解决特定问题提供了标准化的方法。在项目中合理应用设计模式,可以避免重复解决相同类型的问题,使我们能够更加专注于具体的业务逻辑,减少重复劳动。设计模式在定义系统结构时通常考虑到未来的扩展。例如,工厂模式、策略模式等能让系统在增加新功能时无需改动现有代码,只需扩展新模块即可,减少了修改现有代码的风险。今天分享的是单例模式和模板模式,这两种设计模式在项目和源码中的使用。
2025-02-19 13:02:12
1080
原创 时间轮:XXL-JOB 高效、精准定时任务调度实现思路分析
大家好,我是此林。定时任务是我们项目中经常会遇到的一个场景。那么如果让我们手动来实现一个定时任务框架,我们会怎么做呢?
2025-01-29 17:12:08
934
原创 RocketMQ学习笔记
这里采用broker双主双从(同步模式),NameServer、Producer、Producer集群由于无状态性,搭建简单。RocketMQ默认的虚拟机内存较大,启动Broker如果因为内存不足失败,需要编辑如下两个配置文件,修改JVM内存大小。1. 先从rocketmq官网下载二进制包,ftp上传至linux服务器,unzip命令解压。负载均衡模式消费:多个消费者共同处理broker消息队列的消息。广播模式消费:每个消费者都会收到订阅的Topic的消息。服务器:192.168.183.132。
2024-12-31 21:19:36
702
原创 MYSQL慢查询日志(开启慢查询配置、explain执行计划SQL优化、各个字段详解、索引失效)
慢查询日志记录了所有执行时间超过了long_query_time的SQL语句。默认情况下MYSQL未开启慢查询日志。
2024-12-23 22:42:47
1118
原创 SpringBoot 手动实现动态切换数据源 DynamicSource (中)
dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。其支持。JPA用户不建议使用,JPA自带事务,无法连续切库。
2024-12-12 16:38:45
1733
1
原创 SpringBoot 手动实现动态切换数据源 DynamicSource (上)
大家好,我是此林。在实际开发中,经常可能遇到在一个SpringBoot Web应用中需要访问多个数据源的情况。下面来介绍一下多数据源的使用场景、底层原理和手动实现。
2024-12-11 10:34:19
1319
1
原创 深入浅出学习ThreadLocal原理(ThreadLocal登录优化、底层源码、内存泄漏问题)、InheritableThreadLocal、TransmittableThreadLocal 解读
大家好,我是此林。今天我们来分享下ThreadLocal的底层原理。ThreadLocal 是Java中的一个类,主要用途是保证。即:每个线程都有自己独立的变量副本,多个线程之间互不影响。
2024-11-28 07:45:25
1237
原创 基于Redis实现原生的消息队列
虽然Redis 的Stream看似完美,但是它还有不足。1. 消息持久化依赖Redis持久化机制,知道Redis持久化的可以知道无法保证万无一失。2. 消息确认机制只支持消费者确认,不支持生产者确认。3. 不支持消息的事务机制4. 多消费者下的消息有序性问题。所以如果对于消息队列,有更严格的要求,建议使用专业的消息队列,比如RabbitMQ、RocketMQ、Kafka等。
2024-11-14 22:52:46
986
原创 一文看懂:JVM垃圾回收算法、CMS垃圾回收器、G1垃圾回收器
Hello,大家好,我是此林。今天我们来聊一聊 JVM 垃圾回收机制。在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。手动回收的方式相对来说回收比较及时,删除代码执行之后对象就被回收了,可以快速释放内存。缺点是对程序员要求比较高,很容易出现创建完对象之后,程序员忘记释放对象。
2024-11-06 23:06:30
1537
原创 JVM Java虚拟机学习笔记
当一个类加载器去加载某个类的时候,会自底向上查找是否加载过,如果加载过就直接返回,如果一直到最顶层的类加载器都没有加载,再由顶向下进行加载。
2024-11-01 22:58:47
1374
原创 深入浅出:SpringBoot启动流程源码分析 (包含Spring IOC容器创建、自动配置时机、内置tomcat启动原理)
的值,这个值是一个全类名数组,这些类实现了 ApplicationContextInitializer 接口,用于在 ApplicationContext 初始化之前进行一些自定义的初始化操作。的值,这个值也是一个全类名数组,这些类实现了 ApplicationListener 接口,用于监听 Spring 应用上下文中的事件。它们也是需要自动装配的类。今天来深入底层讲一讲SpringBoot是如何启动的,也就是我们单击运行SpringBoot启动类,它底层发生了什么?Hello,大家好,我是此林。
2024-10-29 12:08:04
1043
原创 SpringBoot自动配置原理:底层源码分析
而SpringBoot 则使用默认的配置帮我们自动装配类,减少了大量繁琐重复的细节,这也就是为什么SpringBoot “约定大于配置”的原因了。mybatis-spring-boot-starter 和 pagehelper-spring-boot-starter,并且在yml文件里手动配置了Bean,而这几个配置类是默认没有的。这使得自动配置类的加载时机在手动配置类被解析之后、Bean 定义被加载之前。这样做的目的是优先解析手动配置类,因为有时候我们可能并不想使用默认的自动配置类,所以手动配置重写。
2024-10-26 22:56:06
1167
原创 进阶版:深入浅出 Spring AOP底层原理分析(附自定义注解案例)(二)更新已完结
以上就是Spring AOP源码第一部分的内容,总结一下,AnnotationAwareAspectJAutoProxyCreator这个类负责扫描你的项目,找到所有带有 @Aspect 注解的类,根据目标对象是否实现了接口选择用JDK Proxy还是CGLIB生成代理对象。3. 检查 earlyProxyReferences 中是否已经存在该 bean 的早期引用,如果存在且不等于当前 bean,则调用 wrapIfNecessary 方法来包装 bean,然后返回代理后的Bean。
2024-10-24 22:11:55
1451
原创 小白版:深入浅出 Spring AOP底层原理分析(附自定义注解案例)
Spring 的通知类型包括:@Before前置通知,@After后置通知,@AfterReturning返回通知, @Around环绕通知,@AfterThrowing异常通知。可以看出,Spring AOP 的底层实现非常优雅,依赖于动态代理和责任链模式,使用代理类拦截方法调用,再通过 ReflectiveMethodInvocation 来管理增强逻辑的执行顺序。JDK 动态代理是基于接口的,它会创建一个实现目标接口的代理类,所有方法调用都会委托给代理类的 invoke 方法。
2024-10-22 22:52:55
1130
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人