- 博客(63)
- 收藏
- 关注
原创 MySQL InnoDB 存储引擎(原理机制、核心特性与应用实践全解析)
InnoDB是 MySQL 官方默认的事务型存储引擎,自 MySQL 5.5 之后完全取代 MyISAM 成为默认引擎。支持事务(ACID属性)行级锁(高并发)支持外键约束支持MVCC(多版本并发控制)支持崩溃恢复、自带缓存池支持聚簇索引自动化的死锁检测。
2025-08-09 10:44:24
1013
原创 Java实现线程任务的方式有哪些?及其区别详解(含详细代码)
方式实现难度是否可返回结果是否易扩展是否支持线程池实用范围继承Thread容易否差否测试,玩具代码实现Runnable容易否好是业务开发、简单异步实现Callable一般是好是任务需返回值或抛异常一般是好是需拿结果的异步任务线程池Executor一般都支持极好内置高并发场景必用定时任务Scheduled一般部分支持好内置定时/周期任务。
2025-08-08 11:16:50
701
原创 说下Fork/Join框架,与传统线程池有何不同?(含详细代码讲解)
Fork/Join框架专为递归、分治的大数据量并行任务设计,底层的工作窃取让多核利用率达最佳效果。与传统线程池相比更擅长“自动拆分、大任务合并”的场景。适合用于高性能数据处理和多核算法、并行流。日常Web、异步通知等仍建议用简单高效的ThreadPoolExecutor。
2025-08-07 10:11:52
1361
原创 Future和CompletableFuture的区别?原理全解与详细代码示例
Future接口是Java 5引入的,代表着一个异步任务执行后结果的“占位符”。你可以提交任务,稍后通过Future对象获取结果或监控状态。是Java 8新增的异步任务增强API,是Future的升级版。它不仅实现了Future接口,还扩展了功能,支持丰富的异步编排、流式API、事件回调等。Future 和 CompletableFuture 都是Java异步编程的重要工具。Future简单但能力有限,逐渐成为“历史遗留”;
2025-08-06 13:50:43
1102
原创 微服务连环雪崩问题及其解决方案详解(熔断+降级+超时实战代码)
定义:在微服务架构下,服务之间相互依赖(A->B->C),当底层某个服务(如C)因故障或响应缓慢,导致上游服务(B、A)请求全部阻塞乃至资源枯竭,最终整个调用链路全面崩溃,这种现象即“连环雪崩”。微服务连环雪崩只需一个服务异常,所有上游就会被拖垮,稳定性设计必须前置防控。超时、熔断、降级是抵御雪崩的三大法宝,务必为每条远程依赖链路配置。推荐使用Resilience4j、Hystrix(维护模式)等中间件,或自己编码隔离+降级逻辑。
2025-08-05 10:34:47
927
原创 深度解析AOP注解实现原理:JDK动态代理、CGLIB动态代理及应用场景
Spring容器启动解析切面、切点、注解等元信息,通过代理织入逻辑,无需业务代码变动即可横切增强。**JDK代理适合有接口类;CGLIB适合无接口类。**建议业务层代码尽量对接口编程。代理对象里调用同类非代理方法(即“内部方法调用”)不会触发AOP增强,核心逻辑应避免在同类里直调。对于性能敏感型项目,建议关注不同代理实现的开销差异,合理选择。AOP注解极大提升项目可维护性和扩展性,适合所有横切关注点的场景。
2025-08-05 09:53:14
970
原创 BIO、NIO、AIO的原理及区别与应用场景(含详细代码讲解)
BIO即“Blocking IO”,即传统的阻塞式编程模型。每当有一个客户端请求,服务器都需要创建一个独立的线程进行处理,线程与连接一一对应。在读写操作时,线程会被阻塞,直到数据读/写完成。NIO是Java 1.4引入的“非阻塞式IO”库,又称New IO或Non-blocking IO。与BIO线程一对一不同,NIO采用单线程+多路复用,基于Selector监听多个Channel(通道),只需少量线程即可处理大量连接。AIO又称NIO.2,是Java 7引入的“异步IO”模型。
2025-08-04 17:19:53
543
原创 什么是守护线程?与普通线程的区别?
通俗讲,守护线程就是“为其他线程服务”的一种线程,也可以理解成“后台线程”。当所有非守护线程(即用户线程)都结束运行时,JVM就会自动退出,无论守护线程是否还在运行。用户线程结束,JVM进程就终止;守护线程只要没有用户线程存活,哪怕自己还没跑完,也会被JVM直接强制终止。典型例子:Java虚拟机中的GC(垃圾回收)线程就是守护线程,它们后台不断“回收内存”,随着主程序结束自动销毁。守护线程(Daemon Thread)是伴随用户线程存在的“后台服务线程”,主线程(用户线程)结束后,守护线程自动终止。
2025-08-04 09:14:14
528
原创 说说对泛型的理解?
泛型,顾名思义,就是“参数化类型”。通俗的说,泛型允许在定义类、接口、方法时,将类型作为参数进行传递,使代码可以应用于多种不同的类型。让同一份代码适配不同类型的数据在编译期提供类型检查,避免类型转换异常。
2025-08-03 13:18:24
386
原创 谈谈对反射的理解?
Java反射机制,是指在程序运行期间,能够动态获取类的属性、方法、构造函数等信息,并能够操作对象属性、调用对象方法甚至创建对象实例的能力。换句话说,反射是一种让Java程序有“自省”、“自编程”、“自适应”能力的特殊机制。通过反射,程序可以在不知道对象具体类型的情况下,对对象进行操作。
2025-08-01 16:47:41
343
原创 谈谈你对Java序列化的理解
Java序列化(Serialization)是指把Java对象转化为字节序列,以便用于网络传输、文件保存或其他方式的持久化存储。反序列化则是将字节序列恢复成原有的Java对象的过程。简单来说,序列化是“把对象拍成一张快照存下来”,以后需要的时候“把快照恢复成对象”。Java序列化是Java对象持久化和分布式应用通信的基础能力,虽然操作简单,但处理大数据量、复杂对象、长生命周期或跨版本时,需要关注性能、兼容性及安全性。推荐日常开发选择更现代的序列化框架如Kryo、Protobuf等,并加强反序列化安全校验。
2025-08-01 11:15:53
561
原创 线程池任务的处理流程是什么?(Java线程池原理全解析+实战细节)
在高并发Java开发和微服务应用中,线程池(Thread Pool)已成为提升性能、资源复用、控制并发的重要基石。线程池可以避免频繁创建/销毁线程的高昂开销,让任务调度、线程生命周期、拒绝策略都能有序可控。理解线程池中的,是搞懂Java并发和调优实战的前提。本文将详细梳理线程池从任务提交到最终执行/拒绝的每一环,结合源码和运维建议,带你彻底掌握线程池的核心机制。
2025-07-31 14:29:57
1310
原创 Java分批处理数据,如何保证数据的顺序?
在实际开发中,面对大数据量的处理场景时,我们常常会采用“分批处理(Batch Processing)”的方式,避免一次性加载全部数据造成OOM(内存溢出)等问题。然而,,却是一个非常实用且有挑战性的问题。
2025-07-30 10:34:57
1138
原创 FlinkCDC实现多数据源数据集的增量更新实战
DataX完成首次全量同步,确保基线一致。增量以Flink CDC为主:MySQL、PG源通过binlog/WAL不间断监听与捕获。异构&弱结构源(如API、Excel)通过业务逻辑“增量补料”。Doris侧表模型建议选用唯一键或批量Upsert语义,防止脏数据和数据丢失。连续两次同步之间发生的数据变更,由FlinkCDC自动补充。
2025-07-29 11:05:36
1168
原创 一文解析公平锁、非公平锁、悲观锁、乐观锁、可重入锁和锁的升级(含详细代码实例)
类型定义场景代码说明优缺点公平锁先到先得,排队获取锁银行排队避免饿死但慢非公平锁不按顺序,允许插队绝大多数并发场景或性能高风险饿死悲观锁先锁后用,强制同步核心交易、资金/数据库for update安全性能一般乐观锁无锁冲突检测后重试高频读、低冲突Java原子类、版本号字段快,不适用多冲突可重入锁自身可多次获得同一锁递归与多调用场景灵活无死锁锁的升级JVM智能优化锁粒度JVM自动控制(自动实现)性能最优动态选择。
2025-07-25 11:29:52
748
原创 Synchronized 和 ReentrantLock 有什么区别?核心区别是什么?
是 Java 的内置同步机制,占用 JVM 原语级别的支持。可以作用于方法或代码块,实现对对象/类的加锁,保证同一时间只有一个线程能访问被锁定的代码区域。// 临界区// 同步方法是 JDK 1.5 提供的 Lock 接口实现,可重入互斥锁。其设计思想上与 synchronized 类似,但功能更灵活,扩展性更强,由 Java 代码实现(位于包中)。try {// 临界区核心区别一句话总结是JVM层的“内置”锁,简单易用,不能灵活控制锁的高级特性;而。
2025-07-25 11:27:07
580
原创 mysql 的主从机制是怎么实现的?
MySQL 作为当前最流行的开源关系型数据库之一,为了满足数据的高可用、负载均衡和容灾备份等需求,广泛应用主从复制(Replication)机制。其核心思想是:在一台主库(Master)上发生的所有数据变更都会同步到一台或多台从库(Slave),从而实现多节点间的数据一致性和系统的读写分离。很多初学者疑惑,MySQL 的主从机制究竟是怎样实现的?有哪些关键组件与执行流程?本文将为你系统梳理 MySQL 主从复制的原理、步骤和注意事项,帮助你彻底搞懂这一关键技术点。
2025-07-25 11:14:19
550
原创 平时开发中使用 Redis 分布式锁,有哪些需要注意的问题?
本文总结了Redis分布式锁的6个关键注意事项:1)使用原子命令SET NX EX/PX确保加锁与过期设置同步;2)必须设置过期时间防止死锁;3)通过唯一value和Lua脚本实现安全解锁;4)采用watch dog机制处理业务超时和锁续期;5)注意主从异步复制可能导致锁失效,建议RedLock算法;6)合理设计锁key的粒度与唯一性。遵循这些原则可有效避免Redis分布式锁的常见问题,确保系统安全性和健壮性。
2025-07-25 10:52:41
529
原创 使用SQL递归查询:用WITH AS轻松遍历树形结构
本文介绍了利用SQL递归查询处理树形结构数据的方法。通过WITH ... AS语法(公用表表达式CTE),可以高效查询层级关系数据,如组织架构、菜单等。文章详细讲解了递归CTE的基础语法,并提供了查询子部门、计算层级深度、拼接完整路径等实用示例。还解答了数据库版本要求、防止死循环和性能优化等常见问题。递归CTE能优雅地解决树形数据查询需求,是后端开发和DBA提升数据处理能力的重要技术。
2025-07-25 10:10:40
640
原创 SpringBoot中解决跨域问题
除了在Spring Boot中直接处理跨域问题,我们还可以通过Nginx来解决跨域问题。这种方式将跨域处理逻辑从后端代码中分离出来,由Nginx代理完成跨域支持。如果项目中的所有接口都需要支持跨域,全局配置CORS是一种更优雅的解决方案。我们可以通过实现WebMvcConfigurer接口来完成全局跨域配置。如果需要更灵活的跨域处理逻辑,可以自定义一个过滤器来实现跨域支持。是Spring提供的另一种实现跨域的方式,它通过过滤器来处理跨域请求。这种方式同样可以实现全局跨域配置。四、通过自定义过滤器实现跨域。
2025-05-28 13:45:22
509
原创 mybatis-plus与jsqlparser共用时报sql解析错误
手动引入jsqlparser-4.6版本,但mybatis-plus中引用为4.4版本。jsqlparser版本与mybatis-plus中引用版本一致。排除掉mybatis-plus中的jsqlparser。
2025-05-23 15:39:25
657
原创 面试——MySql索引什么场景下会失效
描述:在联合索引中,如果某列的范围查询中断了索引的有序性,后续列的索引无法生效。描述:当查询条件值的类型与索引列类型不一致时,MySQL 会进行隐式类型转换。描述:MySQL 优化器动态调整索引,可能选择非最佳索引或直接全表扫描。描述:如果 OR 条件中有字段未使用索引,会导致整体索引失效。描述:分区表的查询条件未覆盖分区键时,全局索引可能无法生效。描述:排序或分组字段与索引顺序不匹配时,索引无法生效。描述:查询中包含未索引的字段,可能导致回表或索引失效。=、<>)通常会导致索引失效。
2024-12-04 10:26:12
828
原创 springboot:责任链模式实现多级校验
责任链模式是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。2、实现不同的校验处理器。4、服务类调用责任链。
2024-11-19 17:29:34
729
原创 Java——踩坑Arrays.asList()
查看源码可以看到,asList返回到ArrayList是一个内部类,继承了AbstractList,再查看源码,并没有是哪set,add,remove方法。查看源码可以看到,接收入参为泛型,而基本类型并没有集成Object。asList之后new一个List给他。进行装箱或者直接使用包装类型。new一个新的List。报了不支持的操作异常。
2024-09-06 10:37:19
994
1
原创 Java——踩坑Synchronized
不要使用Integer对象作为锁对象,Integer对象改变,往往会生成一个新的对象,从而导致锁对象不唯一。
2024-06-05 11:51:28
289
原创 面试——数据库中小表驱动大表?为何能提高性能?
student表和school表,执行下面的sql。算法,那么选择哪个表作为外驱表和内驱表至关重要。作为外驱表的话,就是大表驱动小表,时间复杂度将是。作为外驱表的话,就是小表驱动大表,时间复杂度将是。都存在索引的情况下,并且数据库采用的是。**,可见根本不是一个数量级的。有一百条数据,如果选择。
2024-04-25 16:18:58
508
3
原创 面试——数据库中的锁升级(Lock Escalation)机制
以MySQL为例,按照两阶段锁协议,会先给tb_user加上表意向锁,然后对tb_user的所有行加上行锁,但是当tb_user数据量非常多的时候,频繁的获取行锁会影响性能,所以会将表意向锁升级为表锁,后续访问的时候不需要再加锁,这样导致的结果是并发性能降低,因为其他线程访问该表会被阻塞。条件,分批去操作数据,尽量防止全表扫描。因此得出建议:操作表的时候尽量带仨很。假设执行下面的sql语句。
2024-04-24 18:20:40
811
原创 Java——内存溢出如何排查
初始化启动参数最大堆内存为20m,在内存溢出的时候生成一个dump文件,然后存储在对应目录下。打开mat导入内存溢出dump文件,选择。
2024-04-24 18:09:55
832
原创 Java——基于CompletableFuture的流水线并行处理
CompletableFuture在JDK1.8提供了一种更加强大的异步编程的api。它实现了Future接口,也就是Future的功能特性CompletableFuture也有;除此之外,它也实现了CompletionStage接口,CompletionStage接口定义了任务编排的方法,执行某一阶段,可以向下执行后续阶段。
2024-03-26 18:13:29
2161
原创 面试——深度分页问题的优化
在开发中为了防止一次加载太多数据到内存,对内存占用和IO读取开销太大,一般使用limit关键字进行分页加载数据,在数据量比较大的时候,如果进行limit分页查询,越往后,分页查询的效率越低。当在进行分页查询时,如果执行limit 9000000, 10,此时需要排序前9000010条记录,仅仅返回9000000-9000010的记录,其他的记录丢弃,查询排序的代价非常大。丢掉前m条,保留第[m, m+n],n条结果,并返回给客户端返回,从磁盘中读取m+n条数据就是整个查询过程中耗时的操作。
2024-03-26 14:58:34
348
原创 ReentrantReadWriteLock
注意,这里的阻塞是一个概率性的阻塞,因为它只是一个启发式的判断,不是绝对的。根据 ReentrantReadWriteLock 的特性,第一个线程获取了读锁,第二个线程尝试获取写锁,会被阻塞。如果按照 ReentrantReadWriteLock 的特性,第三个线程应该可以成功获取读锁,因为读锁是共享锁,不会阻塞其他读线程。但是,实际上,第三个线程却被阻塞了。与传统的独占锁不同,ReentrantReadWriteLock 允许多个读线程同时访问资源,但在写线程访问时,会阻塞所有其他读线程和写线程。
2024-03-21 18:54:04
535
原创 面试——Java垃圾回收算法和垃圾回收器
他不但只会用一个线程去收集垃圾,在收集垃圾的时候其他的所有工作线程必须停止,即会发生Stop the World现象,对于Stop the world(在垃圾回收开始时停掉其他所有的线程,只供垃圾回收器回收使用,对于系统尤其是高并发系统来说就是一个噩梦),直到垃圾回收结束。复制算法将堆内存分为两个区域,通常是”From“区和”To“区,当”From“区的对象被标记为存活时,它们将被复制到”To“区,而未被标记的对象将被丢弃,完成复制后,”From“区和”To“区的角色交换。标记-清除算法分为两个主要阶段。
2024-02-28 18:46:02
1067
原创 面试——双亲委派机制
我们再看第四个问题,我们想我们要怎么实现jsp文件的热加载,jsp 文件其实也就是class文件,那么如果修改了,但类名还是一样,类加载器会直接取方法区中已经存在的,修改后的jsp是不会重新加载的。这样保证了Class执行安全。在加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。如果父加载器及bootstrap类加载器都没有找到指定的类,那么调用当前类加载器的findClass方法来完成类加载。
2024-02-27 18:22:26
1049
原创 面试——类加载机制
4、解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用。1、加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。3、父类的变量和代码块(先声明的先执行)
2024-02-27 17:36:11
452
原创 Lambda表达式代替观察者模式
场景:用户申请退款,系统同意退款。:创建多个观察者类,注册,通知。3、调用支付接口进行退款。2、发送站内信与短信。
2024-02-19 18:58:00
415
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅