- 博客(115)
- 收藏
- 关注
原创 MySQL Spring 事务全家桶:事务本质、隔离级别、传播机制与失效场景全解析
本文系统讲解Java后端面试中的事务考点,涵盖MySQL事务ACID特性与实现机制、四种隔离级别及三类并发问题、Spring事务模型与@Transactional执行流程、八种传播行为解析,以及常见事务失效场景分析。文章从底层数据库原理到上层框架实现,提供完整知识链路,帮助开发者构建体系化的事务认知,并给出可直接用于面试的结构化回答模板。
2025-11-24 17:57:16
465
原创 Java AQS 全体系:从设计哲学到核心原理的全链路解析
为了真正理解 AQS,最好的方式就是自己写一个 sync。// 内部静态类,继承 AQS private static class Sync extends AbstractQueuedSynchronizer {// 是否处于独占状态 @Override protected boolean isHeldExclusively() {} // 尝试获取锁,state 从 0 -> 1 @Override protected boolean tryAcquire(int acquires) {
2025-11-23 10:07:53
1078
原创 synchronized vs CopyOnWrite 系列
并发编程中解决共享数据问题的两条核心路径:互斥锁(synchronized)和写时复制(CopyOnWrite)。前者通过对象头和监视器实现锁升级机制,提供强一致性但影响吞吐量;后者以空间换时间,读写分离实现无锁读但写性能较差。synchronized采用偏向锁、轻量级锁和重量级锁的渐进式优化,保证内存可见性;CopyOnWrite通过volatile引用和数组复制实现线程安全。两种方案分别适用于写密集型和读密集型场景,开发者需根据业务特点权衡选择。
2025-11-20 04:02:45
1021
原创 背包问题全家桶(完全背包、组合数背包、分组背包)
本文系统讲解了动态规划中三类经典背包问题:完全背包、组合数背包和分组背包。完全背包允许物品无限次选取,采用正序遍历;组合数背包求解方案数,区分组合和排列两种场景;分组背包要求每组最多选一个物品,需要倒序遍历。文章详细分析了各类背包的状态定义、转移方程和实现模板,并对比了它们与0-1背包的核心区别。掌握这些背包模型有助于理解动态规划的基础思想,为学习更复杂的DP问题奠定基础。
2025-11-16 03:49:41
809
原创 操作系统复习总结(第九章:IO 系统)
摘要:I/O系统是操作系统连接CPU与外设的关键子系统,主要解决CPU与I/O设备间的速度差异问题。系统采用分层结构(用户层I/O、设备独立性软件、设备驱动等),提供设备屏蔽、统一接口、性能优化等功能。I/O控制方式包括轮询、中断驱动、DMA和通道技术,其中DMA是主流方案。缓冲技术(单/双缓冲、环形缓冲等)和假脱机技术(如打印机共享)提高了I/O效率。系统通过设备独立性和驱动程序实现硬件抽象,其完整层次结构是面试重点。理解I/O机制对优化存储和网络性能至关重要。
2025-11-16 03:49:09
1061
原创 操作系统复习总结(第八章:文件系统)
本文系统总结了文件系统(File System)的核心内容。首先介绍了文件的基本概念与属性(文件名、类型、权限等),重点分析了文件的逻辑结构(流式、记录式、索引式)和物理存储方式(连续、链接、索引分配)。然后详细讲解了目录管理(单级、树形、无环图结构)、文件控制块(FCB)和索引节点(inode)的实现机制。在磁盘管理方面,阐述了空闲空间管理(位图法)和调度算法(SCAN、CSCAN等)。最后介绍了文件访问控制、挂载机制、日志文件系统等现代特性。全文构建了文件系统的完整知识体系,对理解操作系统存储管理具有重
2025-11-16 03:48:31
641
原创 操作系统复习总结(第七章:虚拟内存)
虚拟内存是现代操作系统的核心内存管理技术,它通过分页机制和请求调页实现程序部分装入内存运行。关键机制包括:缺页异常处理流程(判断非法访问、调入页面、更新页表等)、页面置换算法(如接近最优的LRU和实用的Clock算法)以及基于局部性原理的工作集模型。虚拟内存解决了物理内存限制问题,但可能引发抖动现象(过度缺页导致性能下降),需通过控制并发进程数或增加内存来解决。该技术直接影响系统并发度、内存利用率和整体性能,是理解操作系统架构的关键。
2025-11-15 04:56:23
752
原创 操作系统复习总结(第六章:存储器管理)
本文摘要:存储器管理是操作系统的核心功能,主要实现逻辑地址到物理地址的转换,并提供内存保护与共享机制。文章系统介绍了连续分配(单一/固定/动态分区)和非连续分配(分页/分段/段页式)管理方式,重点剖析了分页存储管理的页表结构、TLB快表优化以及地址转换过程。同时对比了分段管理的优缺点,阐述了段页式结合的现代内存管理方案。最后讨论了内存碎片问题及常见面试问题,为理解虚拟内存奠定基础。
2025-11-15 04:55:51
734
原创 操作系统复习总结(第五章:死锁)
本文系统梳理了死锁相关概念与处理方法。首先定义了死锁及其与活锁、饥饿的区别,指出死锁必须满足互斥、占有等待、不可抢占和循环等待四个条件。然后介绍了四种处理策略:死锁预防(通过破坏必要条件)、死锁避免(如银行家算法)、死锁检测及解除。重点讲解了银行家算法的资源分配判断流程和常见死锁场景(如哲学家问题)。最后总结了死锁知识体系对操作系统和并发编程的重要性,并列出常见面试问题。全文涵盖死锁的本质原因、处理方法和实际应用,是理解和解决死锁问题的系统指南。
2025-11-15 04:55:21
1120
原创 操作系统复习总结(第四章:进程同步与互斥)
本文系统梳理了操作系统进程同步的核心内容。首先阐述了同步的必要性,指出多进程访问共享资源可能导致数据竞争,需要互斥和同步机制。然后介绍了同步必须满足的四个条件(空闲让进、忙则等待、有限等待、让权等待)。文章详细分析了各种同步方法:软件实现(单标志法、双标志法、Peterson算法)、硬件实现(中断屏蔽、原子指令)、信号量机制(P/V操作)和管程模型。重点讲解了三大经典同步问题(生产者-消费者、读者-写者、哲学家进餐)的解决方案。最后总结了同步机制的演进路径和常见面试问题,强调同步是操作系统核心理论和重要考点
2025-11-15 04:54:51
868
原创 复习总结操作系统(第三章:处理机调度与切换)
本文概述了操作系统中处理机调度的核心内容。首先介绍了调度的三个层次:高级调度(作业调度)、中级调度(内存调度)和低级调度(进程调度),说明其各自功能特点。其次分析了调度触发时机和两种调度方式(非剥夺式与剥夺式)。重点阐述了7种典型调度算法(FCFS、SJF、SRTF、RR、HRRN、优先级调度和多级反馈队列)的原理、特点及适用场景。然后讲解了上下文切换的过程和开销。最后总结了调度评价指标并对比了各算法的优劣。现代操作系统普遍采用综合性能最优的多级反馈队列调度算法。本章内容为理解CPU资源分配机制奠定了基础。
2025-11-15 04:54:07
1013
原创 复习总结操作系统(第二章:进程管理)
本文系统总结了操作系统第二章“进程管理”的核心内容。首先阐述了进程的定义与组成,强调PCB作为进程唯一标识的重要性。其次分析了进程的五种基本状态及转换关系,包括就绪、运行、阻塞等状态。文章重点讲解了进程控制操作(创建、终止、阻塞/唤醒、切换)的实现原理,指出这些操作都是具有原子性的原语操作。最后简要提及进程通信的几种机制。这些概念为后续CPU调度、同步互斥等章节奠定了理论基础,完整呈现了操作系统管理进程的基本框架与核心思想。
2025-11-15 04:46:20
825
原创 ConcurrentHashMap 全体系深度解析(JDK 1.7 → JDK 1.8 全面对比)
摘要:ConcurrentHashMap 是 Java 并发编程的核心容器,解决了 HashMap 线程不安全与 Hashtable 性能差的问题。JDK1.8 采用 CAS + synchronized + 红黑树实现,通过分段锁(桶级锁)、volatile 变量和多线程协作扩容机制,兼顾线程安全与高性能。关键特性包括:put 操作空桶用 CAS、非空桶用 synchronized,链表长度≥8且容量≥64时树化,get 全程无锁,禁止 null 值。其设计演进(从 JDK1.7 分段锁到 1.8 细粒度
2025-11-15 04:30:45
800
原创 Spring Boot + MyBatis 整合与 MyBatis 原理全解析
摘要: MyBatis作为企业级Java项目中广泛使用的数据访问框架,与Spring Boot整合紧密。文章首先介绍了MyBatis的核心特点:SQL可控性强、性能高、对DBA友好。随后详细剖析了其与Spring Boot的整合机制,包括自动创建SqlSessionFactory、扫描Mapper接口并生成动态代理对象。重点讲解了MyBatis的执行流程:通过Mapper代理找到SQL,由Executor执行,最终通过ResultSetHandler处理结果集。此外,还阐述了动态SQL的实现原理、缓存机制(
2025-11-15 03:20:20
685
原创 Spring Boot 原理全解析:自动装配、启动流程、Starter 机制与配置体系
Spring Boot的核心原理主要包含自动装配机制、Starter机制、条件注解体系和启动流程。通过@EnableAutoConfiguration注解实现自动加载配置类,结合@Conditional条件注解确保智能配置。Starter机制整合依赖与自动配置,简化模块集成。SpringApplication启动流程包含环境准备、容器初始化、Bean加载和Web容器启动等关键步骤,实现"零配置即可运行"的目标。这些机制共同构成了Spring Boot"约定优于配置"的
2025-11-15 03:17:01
907
原创 Spring 核心原理全解析:IOC、DI、Bean 生命周期与 AOP
Spring是一个以IOC容器为核心、AOP为重要支撑的企业级开发框架,主要解决对象管理、依赖注入和横切逻辑三大问题。IOC容器通过控制反转将对象创建和管理权交给框架,DI实现依赖关系的自动装配。Bean的生命周期包括注册BeanDefinition、实例化、依赖注入、Aware回调、BeanPostProcessor处理、初始化和放入单例池等步骤。AOP通过代理机制实现无侵入的横切逻辑织入。理解IOC/DI、Bean生命周期、AOP和循环依赖等核心机制,是掌握Spring框架的关键。
2025-11-15 00:44:08
712
2
原创 Redis 全体系深度解析(架构原理、性能模型、使用场景、持久化机制、过期策略与最佳实践)
Redis是高性能内存数据库及分布式协调组件,核心优势包括内存存储(10万+QPS)、丰富数据结构(字符串、集合、有序集合等)和多功能性(缓存/锁/队列等)。采用单线程+IO多路复用架构,通过内存操作和高效数据结构实现极速响应。支持RDB快照和AOF日志两种持久化机制,提供主从复制、哨兵和集群三种高可用方案。典型应用场景涵盖缓存、计数器、排行榜等,但需注意大Key规避和内存淘汰策略设置。作为现代系统标配,Redis以"内存存储+高效数据结构"的组合实现微秒级响应,成为高并发架构的核心支柱
2025-11-14 23:45:23
1142
4
原创 MySQL 全体系深度解析(存储引擎、事务、日志、MVCC、锁、索引、执行计划、复制、调优)
本文系统梳理了MySQL的核心机制,主要包含以下要点: InnoDB引擎特性:支持事务、行级锁、崩溃恢复,采用聚簇索引结构。 2.索引体系:详解B+树索引优势、聚簇/二级索引、覆盖索引与回表机制。 3.并发控制:MVCC实现非阻塞读,通过Read View和undo log版本链实现。 4.锁机制:记录锁、间隙锁和Next-Key Lock共同保证并发安全与避免幻读。 5.日志系统:redo log确保崩溃恢复,undo log支持回滚,binlog实现主从复制。 6.性能优化:索引下推减少回表,Expla
2025-11-13 19:04:36
1435
原创 JVM GC 垃圾回收体系完整讲解
本文系统介绍了JVM垃圾回收机制的核心原理。JVM通过可达性分析判断对象存活,并设计了强、软、弱、虚四种引用类型实现细粒度内存管理。基础垃圾回收算法包括标记-清除、复制和标记-整理,现代JVM采用分代收集策略,将堆划分为新生代和老年代。文章详细解析了从Serial到ZGC的垃圾收集器演进历程,重点分析了CMS、G1和ZGC等现代收集器的特性及适用场景。整体概括了JVM从对象存活判断到内存管理的完整GC体系,展现了向更低停顿、更高吞吐的发展趋势。
2025-11-13 18:26:50
658
原创 JVM 内存结构、堆细分、对象生命周期、内存模型全解析
本文系统介绍了JVM内存体系结构,主要包含以下要点:1) JDK8后内存分为线程私有区域(程序计数器、虚拟机栈、本地方法栈)和共享区域(堆、方法区);2) 重点比较了永久代和元空间的区别,指出元空间改用本地内存的优势;3) 详细解析堆内存结构(新生代Eden/Survivor和老年代)及对象分配流程;4) 说明垃圾回收机制,包括Minor GC和Full GC;5) 总结了JVM内存设计的核心目标是为提升GC和执行效率。文章通过清晰的结构图示和关键要点提炼,帮助理解JVM内存管理的核心理念。
2025-11-13 18:00:29
447
原创 类加载机制、生命周期、类加载器层次、JVM的类加载方式
Java类加载机制是JVM动态加载字节码到内存并转换为可执行类的过程,包括加载、验证、准备、解析和初始化五个阶段。采用双亲委派模型确保安全性和避免重复加载,包含Bootstrap、ExtClassLoader和AppClassLoader三个层次。类加载方式包括隐式加载、显式加载和自定义加载,后者常用于热部署和模块隔离。该机制体现了Java的动态性,是反射、SPI等技术的基础,通过生命周期管理和灵活的加载方式支持JVM的安全运行和扩展能力。
2025-11-13 17:41:45
1036
原创 ThreadPoolExecutor 原理与核心参数
ThreadPoolExecutor是Java并发包的核心线程池实现,采用线程复用机制提升性能。其核心机制包括:任务提交后,优先创建核心线程执行;队列未满则入队;队列满则创建临时线程;超额触发拒绝策略。关键参数包括核心/最大线程数、任务队列、保活时间和拒绝策略。内置工厂方法(如Fixed/Cached线程池)提供便捷创建方式,但建议显式配置ThreadPoolExecutor以避免潜在问题。线程池通过状态机(RUNNING/SHUTDOWN等)管理生命周期,适用于CPU/IO密集型等不同场景,体现了&quo
2025-11-12 21:17:19
751
原创 `synchronized`详解与锁优化机制
Java中的synchronized是一种基于JVM的内置锁机制,通过对象监视器(Monitor)实现互斥访问和内存可见性。其底层涉及对象头(Mark Word)的锁标志位变化,支持无锁、偏向锁、轻量级锁和重量级锁四种状态。JVM通过偏向锁(优化单线程场景)、轻量级锁(交替竞争)、自旋锁(避免上下文切换)、锁粗化(扩大同步范围)和锁消除(去除无竞争锁)等机制优化性能。相比ReentrantLock,synchronized更简单但功能有限,后者提供更灵活的锁控制。从JDK5开始,synchronized经过
2025-11-12 13:45:21
833
原创 JDK 8 的 HashMap 底层原理
摘要: JDK8的HashMap底层采用数组+链表+红黑树的复合结构,通过哈希函数定位元素,平均时间复杂度为O(1)。关键优化包括:链表长度>8且数组≥64时转为红黑树(O(log n)),负载因子0.75平衡空间与性能,扩容时容量翻倍并利用位运算高效重分布。非线程安全,多线程环境下需使用ConcurrentHashMap。JDK8通过高位扰动、树化机制等提升性能稳定性,体现了工程化设计思维。HashMap是典型的空间换时间实现,理解其结构有助于掌握Java集合框架的核心设计。
2025-11-12 13:17:24
1011
原创 ArrayList 的底层与自动扩容机制
ArrayList是基于动态数组实现的顺序表,默认构造方法采用懒加载策略,初始容量为0,首次添加元素时扩容至默认10。底层使用Object数组存储数据,通过1.5倍扩容机制(Arrays.copyOf)实现动态增长。扩容操作具有O(n)时间复杂度但因摊销仍接近O(1)。size记录实际元素数而非数组容量。ArrayList支持快速随机访问(O(1)),但插入删除需移动元素(O(n))。多线程环境下非线程安全,可通过Collections.synchronizedList或CopyOnWriteArrayLi
2025-11-12 12:47:49
546
原创 什么是反射(Reflection)及其使用
摘要:Java反射机制允许程序在运行时动态获取和操作类信息,打破了编译时类型确定的限制。核心思想是通过Class对象实现运行时自省,主要涉及Class、Field、Method等类。常见应用包括框架实现、序列化工具、动态代理等。反射虽提高了灵活性,但存在性能损耗和安全性问题。优化方案包括缓存数据、跳过安全检查等。该机制是Java动态能力的核心,为框架开发提供了关键支持,尽管需权衡性能与灵活性。
2025-11-12 12:07:11
1514
原创 为什么需要泛型(Generics)?
本文剖析了Java泛型的核心机制及其设计哲学。泛型的本质是"类型参数化",通过编译期类型检查和类型擦除,在保持运行时兼容性的同时实现了类型安全。泛型的三大价值在于:编译期类型安全、代码复用性提升、增强可读性。文章揭示了类型擦除的技术实现,解释了泛型在运行时的限制原因,并探讨了通配符、泛型方法等进阶应用。最后对比了Java与C++泛型设计哲学的差异,指出Java泛型体现了"编译期确定错误"的安全导向,实现了代码复用与类型安全的平衡。
2025-11-12 00:49:28
939
原创 接口(interface)与抽象类(abstract class)的区别
摘要:接口与抽象类的核心区别体现在设计理念、语法特性和使用场景上。接口定义行为规范("能做什么"),支持多实现;抽象类提供继承结构("是什么"),允许单继承和状态管理。接口适合能力扩展,抽象类适合共性抽取。Java 8+允许接口包含默认方法,但仍保持纯粹的行为契约特性。二者共同体现了面向对象"依赖抽象而非实现"的设计哲学。
2025-11-12 00:32:16
429
原创 对equals()和hashCode()的理解?
摘要:Java中equals()和hashCode()的关联性体现了对象逻辑比较与物理存储的契约关系。核心规则是:若两对象equals()相等,则hashCode()必须相同,反之则不必。这种设计确保哈希容器(如HashMap)能正确工作:先通过hashCode()定位桶位置,再用equals()处理哈希冲突。若只重写equals()会导致逻辑相等的对象被存入不同桶,破坏容器功能。哈希碰撞允许不同对象拥有相同hashCode(),但相等的对象必须保持哈希一致。这两个方法分别对应对象的"逻辑身份&q
2025-11-12 00:22:57
341
原创 String、StringBuffer与StringBuilder的区别?
String、StringBuffer与StringBuilder的区别
2025-11-12 00:09:22
298
原创 从一种统一接口的封装方式到SpringMVC调用链的梳理
我们知道 DispatcherServlet 是实现了 Servlet 接口的,而 Servlet 对请求的处理是从 service 方法开始的,所以我找到了 FrameworkServlet(DispatcherServlet 的父类) 的 service 方法。接口封装一般是必不可少的,平常遇到的封装方式可能是下面这种,创建一个类ResponseResult,然后返回数据的时候统一返回ResponseResult类型的对象。最后总结出他的调用链大概是这样的。
2023-02-20 08:59:27
353
原创 HashMap源码解析二
所以关键的地方就在于 **(newCap - 1)**新增的1的位置,和hash值与之对应位置上的数做位于运算,该位置的值是否等于1,等于1就位置改变,等于0就放在原位置。这两个**(newCap - 1)**的区别在于,扩容后新增加的1是倒数第六个位置,刚好hash值的倒数第六个值也是1,所以发生了位置改变。其他两次都是因为扩容后,(newCap - 1)新增加的1的位置,hash值与之对应的位置上确实0,所以没有发生位置改变。后面的 (h >>> 16) 这步操作是将 h 的高16位移动到了低16位。
2022-11-24 18:20:14
410
原创 HashMap源码解析一
HashMap 的源码,基本上面试都被问烂了,我记得我大三暑假开始找实习,过半公司都会问到这玩意。java1.7和1.8的 HashMap 数据结构,1.7是数据+链表,1.8多了一个红黑树。默认的加载因子是 0.75。当链表长度大于等于8,数组长度大于等于64时,链表会树化;当树的元素小于等于6的时候,又会退变成链表。HashMap 的容量都是 2 的整数倍。链表的插入方法, 1.7的时候是头插法,1.8变成了尾插法。可能还会讲一下1.8的扩容机制。
2022-11-23 16:51:43
547
原创 Method breakpoints may dramatically slow down debugging(项目debug启动不起来)
原因:mapper层有方法打了断点。
2022-11-02 09:04:36
228
原创 ArrayList源码解析二
当我们可预知要保存的元素的多少时,要在构造ArrayList实例时,就指定其容量,以避免数组扩容的发生。最后终于确定 newCapacity 的值后,就调用 Arrays.copyOf() 去扩容,这个方法的底层是 native 方法,就不细究了。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。是用来记录操作次数的,一般在我们的增加和修改的方法里面使用,是一种线程安全机制,具体的作用这里不细讲。,就告诉我们,扩容不是直接就能扩的,得把溢出的情况排除。
2022-10-10 18:16:23
367
原创 ArrayList源码中的MAX_ARRAY_SIZE
如果有了 MAX_ARRAY_SIZE 的话,那么这些(Some VMs)会在 数组长度为 Integer.MAX_VALUE - 8 的时候,再增加元素才会报错,其他VM会正常的扩容到 nteger.MAX_VALUE。很多人看到 MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 这句代码,就说 Arraylist 的最大容量是 Integer.MAX_VALUE - 8 ,这是不对的。思索了很久,再结合源码的注释,我开始想是不是兄弟们把这个问题想复杂了啊。
2022-10-10 18:13:06
1040
原创 ArrayList源码解析一
一问到ArrayList,我们会简单的想到他的一些性质:动态数组(自动扩容);允许任何元素插入(包括null);初始化容量为10等等。下面我们试着解析一下源码,探索一下 Java 是怎么实现 ArrayList 的。因为会按功能去解析,所以下方类的顺序和源码中的不一定一致。可以看出 ArrayList 本质上是一个 object 类型的数组。object是所有类型的父类的,所以能插入任意元素也不足为奇了。size 就是获取ArrayList的大小(包含的元素数量),没什么讲的。DEFAULT_CAPA
2022-07-14 17:54:38
375
原创 Java并发线程基础知识
目录线程状态及转换新建(New)运行(Runnable)阻塞(Blocked)无限期等待(Waiting)有限期等待(Timed Waiting)死亡(Terminated)Thread的state枚举类源码线程创建方式继承 Thread 类实现 Runnable 接口实现 Callable 接口一些线程机制Executor线程池的好处线程池核心类ThreadPoolExecutor主要参数主要的四种创建方法Daemonsleep()线程互斥同步synchronizedReentrantLocksynchr
2022-05-27 09:30:37
236
原创 php基础语法
目录1、标记2、数据类型基本数据类型Boolean(布尔型)String(字符型)Integer(整形)Float(浮点型)复合数据类型Array(数组)Object(对象)特殊数据类型NULLResource(资源)3、变量声明变量变量的命名规则4、变量作用域局部变量与局部作用域全局变量与全局作用域5、变量赋值直接赋值拷贝赋值引用赋值6、可变变量7、预定义变量8、静态变量9、global与$GLOBALS:在函数内访问全局变量10、注释单行注释多行注释11、常量define定义常量constant定义常量
2022-05-26 17:00:24
519
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅