- 博客(52)
- 资源 (1)
- 收藏
- 关注
原创 类加载器失效的坑
你遇到的“只能加载当前模块配置文件”的问题,其实是类加载器资源可见性受限的表现。方式是否支持跨模块加载是否受类加载器限制❌✅✅(视具体运行环境)✅(上下文依赖)Spring✅(框架处理)❌(更灵活)文件系统方式(Path/File)✅(只要路径正确)❌。
2025-05-23 16:56:46
164
原创 交换机,路由器的作用
❗ 主机发往异网目标,会把包交给默认网关(路由器);❗ 交换机只管 MAC 地址,不懂 IP,负责把数据帧送到路由器接口;❗ 通过 ARP,主机能知道路由器的 MAC 地址;❗ 最终数据包 IP 层的目标是远程主机,链路层的目标是“网关”。“交换机是搬运工,认 MAC 不认人(IP),帮主机把包送到网关;路由器才是指路的,认 IP 决定去哪走。
2025-05-22 19:31:59
158
原创 网络通信-IP解析
IP 地址的网络号由子网掩码决定,不能单看前三段IP。判断两台设备是否在同一局域网,必须比较两者的子网掩码是否相同,且按掩码计算的网络号是否相同。了解私有地址段,便于识别局域网内部设备。
2025-05-22 18:47:28
409
原创 BeanFactory 和 FactoryBean
特性定义Spring 容器的核心接口用户自定义的工厂接口,实现复杂 Bean 创建功能管理和创建 Bean 实例定义如何创建一个特殊的 Bean 实例作用容器整体管理 Bean 生命周期负责产生具体 Bean 的实例返回对象返回被管理的 Bean 实例返回 FactoryBean 生成的 Bean 实例获取 FactoryBean 本身通过获取自身就是一个 Bean,但对外暴露的是它生产的对象一级缓存完成初始化的单例对象。二级缓存。
2025-05-22 15:38:45
441
原创 Spring AOP
1. Spring容器创建Bean2. BeanPostProcessor.postProcessAfterInitialization判断是否需要代理3. 查找所有Advisor,匹配Pointcut4. 若匹配,生成代理对象(JDK或CGLIB)5. 代理对象替代原始Bean注入容器6. 调用代理对象方法7. 代理对象执行Advisor中Advice链8. Advice执行前后增强逻辑(Before, Around, After等)9. 最终调用目标对象方法10. 返回结果。
2025-05-22 15:34:25
538
原创 JDK动态代理 vs CGLIB动态代理
点内容基础要求目标类必须实现至少一个接口可代理方法只代理接口中定义的方法新增方法目标类新增接口外的方法无法代理性能反射调用,性能较好(JDK优化动态生成字节码)使用场景接口设计良好的业务系统点内容基础要求目标类不能是final类;被代理方法不能是finalstatic可代理方法代理所有publicprotected方法,包括新增方法新增方法支持代理目标类自己新增的方法性能创建代理对象稍慢,但执行阶段性能优于JDK动态代理使用场景无接口或需要代理类所有方法的情况。
2025-05-22 15:31:12
261
原创 三级缓存与循环依赖
缓存层级名称缓存内容作用一级缓存完整初始化且增强后的 Bean 实例最终单例池,正常获取 Bean 首选此缓存二级缓存Bean 的早期引用实例暴露未完成初始化的 Bean,供循环依赖 Bean 使用三级缓存生成 Bean 早期引用的工厂对象延迟创建早期引用,支持 AOP 代理的动态生成,保证引用一致关键点说明三级缓存存工厂对象保证早期引用和最终 Bean 是同一对象引用二级缓存存早期 Bean 实例共享给多个依赖该 Bean 的其他 Bean一级缓存存完全初始化 Bean供正常获取使用。
2025-05-22 15:25:06
323
原创 spring ioc的流程
创建容器对象(如将配置类()或 XML 注册到容器中初始化 BeanFactory,准备好用于存储和管理 Bean 的结构(如加载启动的核心组件(如环境信息、资源解析器等)
2025-05-22 15:10:04
325
原创 binlog怎么实现增量同步
Binlog(Binary Log)是数据库中记录所有数据变更(INSERT、UPDATE、DELETE 等操作)的二进制日志。它记录了数据库的所有事务提交事件,按照时间顺序追加写入。Binlog 实现增量同步的关键是基于日志文件名和偏移量的精准定位;初始化通过全量快照完成,后续持续通过 binlog 增量读取保持数据同步;这种机制有效提升了同步效率,降低了系统压力。
2025-05-22 00:58:46
292
原创 数据库主从同步机制 & 强/弱一致性 & 增量同步工具(Flink CDC / Canal)
✅主从同步是数据库内部机制,基于 binlog 实现高可用读写分离;✅是外部增量同步工具,利用 binlog 实现异构系统之间的数据联动;✅强一致性通过延迟读和同步复制实现,保证每次读取都是最新数据;✅弱一致性允许一定时间的脏读,但系统最终会保持数据一致;✅ 选择一致性级别取决于业务对数据准确性的敏感程度与响应时间要求。
2025-05-22 00:58:20
376
原创 Canal和FlinkCDC的简介
Canal 是阿里巴巴开源的MySQL binlog 增量订阅和消费组件。Flink CDC 是基于 Apache Flink + Debezium 的数据库变更捕获框架,直接将数据库变更事件转为流处理数据。Canal 和 Flink CDC 是现代数据同步和实时处理的基石。它们利用数据库 binlog,实现高效、低延迟、强一致的增量同步与流处理,彻底改变了传统 ETL 的思路。如果你要做轻量级同步,推荐使用Canal;如果你要做实时分析或流式数据计算,推荐使用Flink CDC;
2025-05-22 00:48:38
367
原创 spring/springboot如何解决中文乱码问题
解决位置方法或配置配置开启 UTF-8 编码Spring MVC 手动配置使用过滤器(XML 或 Java Config)Tomcat前端请求设置设置以及请求头 Content-Type。
2025-05-22 00:39:42
183
原创 spring 如何管理mybatismapper接口
或使用:然后直接注入使用:二、关键问题✅ 答案:动态代理 + FactoryBean + 注解扫描三、执行流程简述1. 开启扫描引入 ,注册一个类路径扫描器 。 找到所有 Mapper 接口,给每个注册一个 。 中调用:MyBatis 用 JDK 动态代理生成实现类。你调用的方法(如 ),会转发给 ,再通过 SQL 映射执行。代理对象本质是对方法的拦截,将调用转换为 SQL 执行。通常推荐通过 Service 层调用 Mapper,实现更好的事务控制和业务封装。小
2025-05-22 00:36:16
226
原创 Sping中的设计模式
模式Spring 应用场景工厂模式单例模式单例 Bean、Bean 缓存代理模式AOP、事务模板方法模式观察者模式事件监听机制策略模式Bean 实例化、事务管理、资源加载责任链模式安全过滤器链、拦截器、BeanPostProcessor适配器模式装饰器模式建造者模式。
2025-05-22 00:35:24
747
原创 spring事件监听机制
接口方式(旧)@Component@Override// 发送欢迎邮件注解方式(推荐)@Component// 发送欢迎邮件Spring 的事件监听机制,是基于“观察者模式 + 事件驱动”的通用设计范式,具备解耦、灵活、可扩展的优势,是企业级应用中实现“业务协作”“事务后处理”“系统级通知”的强大工具。
2025-05-21 15:39:22
165
原创 Spring事务失效的解析
Spring 事务通过 AOP 代理实现,事务生效必须走代理对象的方法调用。JDK 动态代理只能代理实现接口的public方法。CGLIB 代理可代理非public(如protecteddefault)方法,但不能代理private方法。方法必须是public,且调用必须通过代理对象,才能触发事务。
2025-05-21 15:28:57
194
原创 spring事务传播行为的实现
处理点说明ThreadLocal事务上下文隐式传递事务状态,跨方法调用保持事务上下文传播行为判断中判断并执行不同传播策略挂起与恢复事务线程事务资源解绑定和重新绑定,支持事务隔离和嵌套嵌套事务支持基于JDBC Savepoint,实现部分事务回滚事务状态封装用管理事务生命周期属性解析与缓存通过快速获得传播行为配置事务同步回调保障事务完成后的回调逻辑执行。
2025-05-21 15:10:39
712
原创 spring事务的管理类型,实现方式,传播行为,基本原理实现
Spring 事务管理提供编程式和声明式两种方式,推荐声明式事务。声明式事务基于 AOP,默认通过注解实现,也支持自定义切点表达式。事务传播行为定义了事务的嵌套及传播策略,保证事务的正确执行。Spring 事务通过代理拦截器实现事务的开启、提交和回滚。事务的通知类被包装为 Advisor,配合切点实现高效灵活的事务增强。
2025-05-21 14:57:27
903
原创 线程池线程异常处理
任务代码里务必用 try-catch 包裹,稳定线程池线程。任务内 try-catch 捕获所有异常,避免异常抛出。异常未被捕获抛出线程执行体外,导致线程死亡。只靠线程池捕获异常机制不够,最好主动处理异常。线程池检测后自动创建新线程替代。线程继续复用,不会因异常挂掉。
2025-05-18 18:41:33
138
原创 跳表(Skip List)学习笔记
✅ 有序结构,支持范围查询。✅ 插入/删除简单,不需要复杂旋转操作。✅ 非常适合高并发环境,读写分离容易。✅ 实现简单,效率高,适合内存数据库和实时索引场景。
2025-05-18 18:35:53
308
原创 线程安全HashMap
哈希表底层是一个数组,每个数组槽(单元)里存储一个链表(或 JDK8 后链表+红黑树混合结构)。也就是说,数据是分布在数组的不同槽中,每个槽可能存一个链表。
2025-05-18 18:35:21
318
原创 HashMap
哈希算法将 key 通过hashCode()转成哈希值,作为“摘要”标识。使用扰动函数进一步均匀分布哈希值,避免哈希冲突聚集。计算数组索引时使用(n 为容量,2 的幂),提高效率。冲突不可避免,设计良好的hashCode()和equals()减少冲突概率。特性说明本质基于哈希算法的键值映射,通过数组快速定位数据底层数据结构JDK7:数组+链表;JDK8:数组+链表+红黑树哈希函数hashCode()+ 扰动函数,位运算快速定位索引冲突解决链表,链表长度≥8且容量≥64时转红黑树。
2025-05-18 17:24:13
639
原创 JVM的内存结构的两个角度:JVM虚拟机层和线程。
│ 主内存 │ ← 所有共享变量↑ ↑工作内存 工作内存(线程A) (线程B)↑ ↑执行代码 执行代码。
2025-05-14 18:11:45
713
原创 锁的优化笔记
机制场景优点注意事项或缺点偏向锁无竞争,单线程反复访问取消加锁过程多线程竞争会退化为轻量级锁轻量级锁多线程访问但冲突较少快速获取锁,避免上下文切换冲突严重时仍会膨胀为重量级锁自旋锁临界区执行非常快避免线程阻塞/唤醒等待时间长会浪费CPU适应性自旋锁自旋锁优化升级更智能,提升资源利用率JVM 维护开销略大分段锁多线程访问共享集合结构并行访问提升实现复杂,需合理分段乐观锁多读少写读快无锁,提高吞吐写冲突时需要回滚或重试锁粗化连续多次加锁解锁。
2025-05-14 15:02:46
349
原创 wait必须放在 synchronized 同步块中?为啥 wait() 在 Object 类里,sleep() 在 Thread 里?
对比点wait()sleep()定义位置Object类Thread类是否释放锁✅ 会释放锁❌ 不释放锁是否需要同步块✅ 必须在中调用❌ 可以在任何地方调用作用线程间通信,进入等待队列等待唤醒当前线程休息一会儿唤醒机制需要其他线程调用notify()时间到了自动醒来wait()是多人协作排队,必须“拉个队伍+发通知”,所以要锁;sleep()是“我先眯一会儿”,不管别人,也不让出门钥匙,自然不用锁。
2025-05-14 14:55:02
312
原创 操作系统进程调度算法
调度顺序(时间轴):P1(2) → P2(2) → P3(2) → P1(3) → P2(1)并不直接使用优先级,而是采用虚拟运行时间(vruntime)计算“谁执行得少”;若长时间执行未完成,会降低优先级,转入较大时间片队列;,不使用固定时间片,而是动态衡量谁最“应该”被调度。必须事先知道或准确预测各进程的运行时间(不现实);一旦调度开始,进程将独占 CPU,直到执行完成;高优先级进程一旦到达,即中断当前低优先级进程。若有高优先级进程就绪,等当前执行完才切换;,当新的更短作业到达时中断当前进程。
2025-05-14 14:38:29
526
原创 死锁,活锁,饥饿的区别
特性死锁活锁饥饿是否运行❌(阻塞)✅(在执行)❌(几乎不执行)是否推进❌❌❌是否冲突✅(互相等待)✅(互相让步)❌本质原因资源循环等待逻辑策略冲突调度优先级问题常见场景多线程加锁自旋/重试逻辑优先级调度不当。
2025-05-14 14:37:19
255
原创 操作系统进程调度算法
调度顺序(时间轴):P1(2) → P2(2) → P3(2) → P1(3) → P2(1)并不直接使用优先级,而是采用虚拟运行时间(vruntime)计算“谁执行得少”;若长时间执行未完成,会降低优先级,转入较大时间片队列;,不使用固定时间片,而是动态衡量谁最“应该”被调度。必须事先知道或准确预测各进程的运行时间(不现实);一旦调度开始,进程将独占 CPU,直到执行完成;高优先级进程一旦到达,即中断当前低优先级进程。若有高优先级进程就绪,等当前执行完才切换;,当新的更短作业到达时中断当前进程。
2025-05-14 14:36:47
530
原创 JAVA的线程调度算法
当有高优先级线程就绪时,系统可以中断当前正在运行的低优先级线程,将 CPU 分配给高优先级线程。Java 的线程调度模型就是抢占式的,但它的实现是依赖于底层操作系统调度器的支持。特性Java 说明调度模型抢占式(Preemptive)是否保证优先级高就一定先执行?否,优先级只是“建议”,实际调度由 OS 决定是否可以直接控制抢占行为?不行,不能强制中断线程,只能配合yield()sleep()join()等手段影响调度。
2025-05-14 14:30:31
324
原创 线程的几种状态以及调用两次 start 方法会怎么样
在 Java 中,线程的生命周期包括多个状态,不同状态之间的转换由线程的生命周期控制方法(如start()sleep()wait()等)和线程调度器共同决定。
2025-05-14 14:16:33
284
原创 CAS和ABA问题
CAS 在比较当前值和期望值时,只能判断值是否相等,而无法判断值在期间是否被其他线程改过然后又改回来。ABA 本质问题:CAS 看不出值“曾经变过”根本解决方法:加入版本号或标志位,感知中间变化实践推荐:使用或,在高并发场景(如锁、队列)中避免 ABA 问题。
2025-05-13 10:35:20
353
原创 ReenTrantLock和Synchronized锁
当一个线程第一次请求锁时,JVM 会记录该线程的 ID,并将锁标记为偏向锁。此后,若同一线程再次访问该锁,JVM 会直接认为该线程已经持有锁,从而避免加锁和解锁操作,提升性能。线程第一次请求锁时,JVM 将锁对象标记为偏向锁,并记录线程 ID。当相同线程再次访问该锁时,JVM 检查对象头中的线程 ID,若匹配,线程直接获取锁,无需再次加锁。如果其他线程争用锁,偏向锁会被撤销,锁将进入轻量级锁或重量级锁状态。:适用于没有竞争的单线程场景,可以显著提升性能。:轻量级锁通常是偏向锁升级后的结果。
2025-05-12 18:28:23
429
原创 可重入锁,公平锁,非公平锁
可重入锁:允许同一个线程多次获得锁,不会发生死锁。常用于递归调用等场景。公平锁:严格按照请求锁的顺序来分配锁,避免线程饥饿。适用于需要严格顺序的场景,但性能开销较大。非公平锁:允许线程“插队”,减少锁的等待时间,提高吞吐量,但可能会导致线程饥饿,适用于性能要求较高的场景。
2025-05-12 18:04:16
297
原创 volatile的可见性与指令重排序
是 Java 中的一个关键字,用于修饰变量。它的作用主要是确保多线程环境下对变量的修改能够及时反映到主内存,避免线程间由于本地缓存带来的数据不一致性。在多线程环境中,每个线程都有自己的工作内存(如 CPU 缓存)。线程对变量的修改首先在其工作内存中进行,不会立即写回主内存。其他线程可能无法及时看到这些修改,导致可见性问题。 保证可见性:当一个变量被声明为 时,JVM 确保对该变量的每次写操作都直接刷新到主内存,并且其他线程对该变量的读取总是从主内存中获取最新值,而不是从线程本地缓存中读取。应用场景:当多个
2025-05-12 17:54:06
746
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人