自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 Spring BeanDefinition 与 Bean 生命周期、循环依赖解析

摘要:Spring框架通过BeanDefinition描述Bean的元数据信息,包含作用域、懒加载和自动装配等核心属性。Bean生命周期分为实例化、属性注入、初始化、使用和销毁五个阶段,提供InitializingBean等扩展点。针对单例Bean的循环依赖问题,Spring采用三级缓存机制(singletonObjects、earlySingletonObjects、singletonFactories)解决setter注入场景,但对原型Bean和构造器注入的循环依赖无法处理。

2026-08-26 11:27:25 357

原创 @Autowired与@Resource注解:发现机制与核心原理

Spring 会通过(类路径 Bean 定义扫描器)遍历指定扫描范围内的所有类,解析类的元数据信息:对于标注了@Component@Service等注解的类,扫描器会将其注册为(Bean 的元数据对象);BeanDefinition 中包含 Bean 的类名、作用域、依赖信息等核心数据,存储在 Spring 容器的中,为后续 Bean 的实例化和依赖注入提供依据。

2026-03-10 10:42:26 653

原创 Spring 单例 Bean

Spring单例与设计模式单例存在核心差异:设计模式单例保证JVM级唯一,通过私有构造器强制控制;Spring单例则是容器级唯一,由容器管理实例。Spring单例Bean的线程安全性取决于状态设计,无状态则安全,有状态需通过ThreadLocal或加锁保证。单例Bean默认容器启动时创建,可通过@Lazy延迟初始化。Spring通过三级缓存机制解决单例循环依赖,存储工厂对象以支持AOP代理和避免不必要实例化。原型Bean的循环依赖则无法解决。理解这些机制对合理使用单例Bean至关重要。

2026-03-10 10:42:05 446

原创 Spring 中 BeanFactory 与 FactoryBean 的核心区别

摘要:BeanFactory是Spring IoC容器的核心接口,负责管理Bean的生命周期;FactoryBean是一种特殊Bean,用于封装复杂对象的创建逻辑。两者的核心区别在于角色定位:BeanFactory作为容器管理者统筹所有Bean,而FactoryBean作为被管理的特殊工厂Bean提供定制化实例化能力。实际开发中多使用BeanFactory的增强版ApplicationContext,它继承了基础IoC功能并扩展了更多企业级特性。理解二者的差异有助于合理选择容器类型,有效解决复杂对象的创建问

2026-01-16 16:20:58 556

原创 多例(prototype)Bean

摘要:Spring多例Bean(prototype)遵循按需创建原则,在主动获取或依赖注入时创建新实例,适合测试场景以避免状态干扰。其生命周期中Spring仅负责创建和初始化,不管理销毁,需手动释放资源。需特别注意单例Bean依赖多例Bean时的失效问题,建议通过ApplicationContext动态获取多例实例。测试中应优先用于状态化组件,避免资源泄露,并合理结合测试框架注解使用。

2026-01-16 16:20:38 565

原创 Spring 原型 Bean

原型 Bean 的核心特性是“按需创建、用完即弃”,其关键注意事项可概括为:① @PreDestroy 方法不执行,需手动管理资源释放;② 会产生循环依赖问题,Spring 无法解决;③ 单例依赖原型时需通过 @Lookup、Provider 等方式避免“原型退化为单例”;④ 天然线程安全(无跨线程共享前提下);⑤ 适合作为请求参数封装类、命令对象等临时数据载体。理解这些特性,才能在实际开发中合理使用原型 Bean,规避潜在风险。

2026-01-16 16:19:59 520

原创 Spring项目启动初始化方案

摘要:Spring提供三类Bean初始化方案:1)@PostConstruct注解用于单个Bean初始化,适合加载专属配置和资源;2)CommandLineRunner接口实现项目启动后的全局初始化,如缓存预加载;3)BeanPostProcessor用于多Bean拦截增强。

2026-01-16 16:19:32 613

原创 Java注解解析

摘要:本文系统介绍了Java注解的核心概念与应用。主要内容包括:1)常见内置注解(@Override、@Deprecated、@SuppressWarnings)的作用与用法;2)4种元注解(@Target、@Retention、@Inherited、@Documented)的功能特性;3)重点解析@Retention的三种保留级别(SOURCE/CLASS/RUNTIME)及其底层实现原理;4)详细说明自定义注解的定义步骤和使用场景,包括运行时注解的反射解析示例。

2025-12-31 11:01:28 1077

原创 Spring事务解析

本文总结了Spring事务管理中常见的问题与解决方案。重点分析了@Transactional注解失效的6种场景(如非public方法、异常处理不当等),详细比较了5种核心事务传播模式(REQUIRED、REQUIRES_NEW等)的特性差异。同时阐述了事务生效的5个必要条件,包括数据源支持、事务管理器配置等。最后给出了实践建议:确保方法为public、避免内部调用、合理选择隔离级别和传播行为等。这些要点为正确使用Spring事务提供了系统指导。

2025-12-31 11:01:13 596

原创 Java内存模型(JMM)

Java内存模型(JMM)是Java多线程编程的核心规范,定义了线程间共享变量的访问规则。JMM通过"主内存-工作内存"的抽象模型,解决并发编程中的可见性、原子性和有序性问题。其核心机制包括:1)Happens-Before规则确保线程操作的顺序性和可见性;2)As-If-Serial规则保障单线程优化安全;3)通过volatile、synchronized等工具实现内存屏障和原子操作。

2025-12-30 09:08:05 1086

原创 类加载方法解析

本文解析了Java类加载器中loadClass与findClass方法的区别:loadClass作为"流程调度者"负责双亲委派模型的执行流程,检查缓存并委托父类加载器;findClass作为"具体执行者"需开发者重写,专注于从自定义路径读取字节码并生成Class对象。二者分工明确,loadClass保障类加载安全性,findClass提供扩展点。

2025-12-30 09:07:39 479

原创 volatile关键字

摘要:volatile是Java的轻量级同步机制,通过内存屏障保证共享变量的可见性(强制刷新主内存)和有序性(防止指令重排)。它适用于基本类型和引用类型,但修饰引用时仅保障引用本身可见,不保护对象内部状态;修饰数组时也无法保障元素可见性。相比synchronized,volatile更轻量但不保证原子性,适合状态标记等简单场景。使用时需注意其边界限制,复杂场景需配合锁机制实现线程安全。

2025-12-29 14:05:06 682

原创 Java线程状态

Java线程生命周期包含6种核心状态:新建(NEW)、可运行(RUNNABLE)、阻塞(BLOCKED)、无限等待(WAITING)、超时等待(TIMED_WAITING)和终止(TERMINATED)。线程中断机制通过设置中断状态位实现协作式中断,而非强制终止。Java线程与操作系统线程存在本质差异,前者是JVM层面的抽象,后者是内核调度的实体。在数据压缩等耗时任务场景中,可通过故障检测、任务重试和降级策略保障业务连续性,并建立完善的线程状态监控体系,包括指标采集、告警规则和日志记录等环节。

2025-12-29 14:04:49 1058

原创 Java线程池相关问题

ThreadPoolExecutor是Java线程池的核心实现类,其核心设计思想是“池化管理线程资源,动态调度任务执行”,通过一套明确的任务处理流程,实现线程与任务的高效匹配。

2025-12-28 12:25:20 763

原创 ReentrantLock相关问题

摘要:本文对比了Java中synchronized与ReentrantLock的核心差异。synchronized基于JVM实现,使用简便但灵活性低;ReentrantLock基于AQS框架,支持公平/非公平锁、可中断获取等特性。重点分析了公平锁与非公平锁的实现机制,以及lock()与lockInterruptibly()的中断响应差异。最后总结了ReentrantLock的适用场景,包括需要公平性、中断响应、复杂同步逻辑等需求。两者各有优劣,开发者应根据具体场景选择合适的同步机制。

2025-12-28 12:25:02 346

原创 CompletableFuture相关问题

本文系统分析了Java异步编程中的任务载体与CompletableFuture框架。首先对比了Thread、Runnable和Callable在返回值、异常处理方面的核心差异。重点剖析了CompletableFuture的三大编排能力:顺序依赖(thenApply)、并行依赖(thenCombine/allOf)和选择依赖(applyToEither)。深入解读其底层实现原理,包括状态管理、回调链触发机制和无锁设计。

2025-12-27 11:04:01 1040

原创 synchronized相关问题

摘要:synchronized是Java内置的同步机制,通过JVM自动管理Monitor对象实现锁功能。其核心特性包括:1)基于对象头与Monitor关联实现锁状态管理;2)保障并发三大特性(原子性、可见性、有序性);3)支持可重入锁机制。JVM采用锁升级策略优化性能:无锁→偏向锁(单线程优化)→轻量级锁(CAS自旋)→重量级锁(内核态阻塞)。适合简单同步需求、低并发场景,但不支持高级锁特性。

2025-12-27 11:03:36 811

原创 JUC核心同步工具

摘要:本文详细解析了Java并发包中的四种核心同步工具类:CountDownLatch(一次性线程等待)、CyclicBarrier(可循环线程屏障)、Semaphore(线程并发控制)和Exchanger(双线程数据交换)。通过对比各工具的核心特性、底层实现(AQS或ReentrantLock)和典型应用场景,揭示了它们的功能差异。

2025-12-26 09:06:31 705

原创 CAS相关问题

CAS机制是无锁编程的核心技术,通过硬件原子指令实现变量的安全更新。其核心原理是比较并交换三个参数:目标变量、预期值和新值。Java通过Unsafe类封装底层指令实现CAS,但也存在ABA问题,可通过版本号机制或AtomicStampedReference解决。无锁栈是CAS的典型应用,利用AtomicReference和循环CAS实现并发安全的push/pop操作。CAS的原子性由硬件指令(如x86的cmpxchg)和软件封装协同实现,CacheLine对齐可优化性能但非必需。CAS机制在保证并发安全的同

2025-12-26 09:01:49 898

原创 StampedLock相关问题

摘要:StampedLock是一种高性能并发锁机制,通过"版本戳"实现无锁读和读写协调。其核心创新是乐观读模式,允许读操作不阻塞写线程,仅通过戳记校验数据一致性。相比ReentrantReadWriteLock,StampedLock不支持重入但性能更高,特别适合读多写少场景。它提供三种锁模式:排他性写锁、共享性读锁和无锁乐观读,需注意戳记管理和锁转换逻辑。选型时应根据读写频率、重入需求和性能要求决定,StampedLock适用于高频查询等读密集型场景,但需警惕其死锁风险。

2025-12-25 09:26:49 562

原创 ThreadLocal相关问题

摘要:ThreadLocal通过ThreadLocalMap实现线程隔离,每个线程持有独立变量副本。核心方法set()/get()操作线程私有变量,需注意内存泄漏风险:Entry的key为弱引用易被回收,而value强引用导致泄漏。解决方案包括被动清理(get/set触发)和主动remove()。InheritableThreadLocal支持父子线程变量传递,但不适用于线程池。TransmittableThreadLocal通过任务包装和变量快照解决了线程池场景的传递问题。

2025-12-25 09:26:26 698

原创 AQS相关问题

Monitor(监视器)是JVM实现线程同步的底层机制,synchronized的同步能力正是基于Monitor实现的。每个Java对象在内存中都隐含一个Monitor关联,确保对对象的同步操作具有排他性。

2025-12-24 09:12:51 865

原创 Set相关问题

本文系统分析了Java中Set集合的实现原理与去重方案。首先对比HashSet与LinkedHashSet的核心差异,指出前者基于HashMap实现无序存储,后者通过LinkedHashMap维护插入顺序。接着解析并发安全的CopyOnWriteArraySet,其采用写时复制机制实现线程安全但写性能较差。最后全面梳理去重方案。

2025-12-24 09:12:23 815

原创 字符串相关问题

摘要:本文深入解析Java String类的核心特性与实现机制。String的不可变性通过final修饰、私有字符数组和复制构造实现,带来线程安全和哈希缓存优势,但也导致修改性能问题。文章对比了concat()与+运算符的拼接性能,分析了trim()与strip()的空白处理差异,以及contentEquals()与equals()的内容比较逻辑。同时探讨了StringBuilder和StringBuffer的可变字符串实现,重点比较其线程安全性差异。

2025-12-23 09:17:13 1349

原创 ArrayList相关问题

本文对比了ArrayList与LinkedList的核心特性,重点分析了ArrayList的底层机制与优化策略。ArrayList基于动态数组实现,具有查询高效(O(1))但插入删除较慢(O(n))的特点,其扩容机制默认按1.5倍增长。针对线程安全问题,推荐使用CopyOnWriteArrayList替代Vector。

2025-12-23 09:16:49 742

原创 Java阻塞队列

本文系统分析了Java中常见的阻塞队列类型及其应用场景。阻塞队列通过内置锁和条件变量实现线程安全,核心特性包括阻塞存取和非阻塞备选方法。

2025-12-22 09:20:55 1261

原创 HashMap相关问题

HashMap底层采用数组+链表/红黑树结构,通过哈希计算和扩容机制优化性能。其核心包括:1)哈希桶数组存储元素,链表处理冲突,红黑树优化查询;2)哈希值计算采用高位扰动,数组下标通过位运算获取;3)动态扩容保持2的幂特性,迁移元素高效。HashMap非线程安全,多线程场景需使用并发容器如ConcurrentHashMap。理解其底层原理对选择容器和编写高性能代码至关重要。

2025-12-22 09:20:11 1108

原创 Java注解本质与底层机制

Java注解本质是继承自Annotation的特殊接口,其生命周期由@Retention元注解控制,分为SOURCE、CLASS、RUNTIME三种策略。SOURCE仅作用于源码阶段,CLASS保留在字节码中但运行时不可见,RUNTIME则在运行时可通过反射获取。不同策略对应不同处理机制:SOURCE依赖注解处理器进行编译期检查或代码生成,CLASS通过字节码工具处理,RUNTIME则利用反射实现运行时行为控制。这种分层设计使注解能够灵活应用于语法检查、字节码增强和依赖注入等场景。

2025-12-21 10:33:57 966

原创 ReentrantReadWriteLock相关问题

摘要:ReentrantReadWriteLock(RRW)是JDK1.5引入的可重入读写锁,基于AQS实现,采用"读共享、写排他"机制。核心特性包括:支持锁重入和公平性选择;允许写锁降级为读锁(确保写后读的数据一致性),但禁止读锁升级为写锁(避免死锁风险)。适用于读多写少场景,相比StampedLock更简洁但功能有限。RRW通过锁降级实现写后读的高效同步,但不支持读锁升级,需通过先释放读锁再获取写锁的方式实现读后写操作。

2025-12-21 10:33:31 309

原创 JVM类加载器

JVM类加载器体系采用层级结构设计,包含启动类加载器(Bootstrap)、扩展类加载器(ExtClassLoader)、应用类加载器(AppClassLoader)和自定义类加载器。它们遵循双亲委派模型,确保类加载的安全性和唯一性,但特殊场景(如SPI机制、Tomcat、OSGi)会打破该模型。类加载器与加载的类形成双向引用,满足条件时可被回收。JVM判断"同一个类"需同时满足全限定名相同且由同一加载器加载,这一机制保证了类的隔离性和安全性。

2025-12-20 11:31:48 773

原创 JVM内存异常

JVM内存异常主要包括内存溢出(OOM)和内存泄漏两大类型。内存泄漏会导致无用对象无法被回收,长期积累最终引发OOM。OOM可分为堆溢出、元空间溢出和栈溢出,各有不同成因和解决方案。内存泄漏表现为内存随时间持续增长,常见于静态集合滥用、缓存未设过期、资源未关闭等场景。排查方法包括监控内存趋势、生成堆快照和使用MAT工具分析引用链。解决思路需针对具体问题,如调整JVM参数、优化代码逻辑或修复泄漏点。

2025-12-20 11:31:25 489

原创 Java SPI和OSGi

SPI与OSGi是Java生态中两种重要的组件化技术,但定位与能力差异显著。SPI是轻量级服务发现机制,通过ServiceLoader实现接口与实现的解耦,支持多实现共存,但存在线程不安全、配置繁琐等局限。OSGi则是完整的模块化生态,通过Bundle实现强隔离、动态部署和版本管理,适用于大型系统,但复杂度较高。二者本质区别在于:SPI解决接口解耦问题,OSGi提供全方位模块化解决方案。SPI适合简单扩展场景,OSGi适用于需要动态模块化的大型应用系统。

2025-12-20 11:30:54 786

原创 JVM类元数据

摘要:类元数据是JVM描述Java类结构信息的核心机制,以Klass结构体形式存储在元空间中。其卸载需满足三大条件:类实例回收、类加载器回收和Class对象无引用。元空间替代永久代具有内存管理优化、GC解耦等优势。

2025-12-20 10:45:47 754

原创 Java内存结构

JVM内存模型分为逻辑规范和物理实现两个层面。逻辑规范定义了方法区、堆内存、虚拟机栈等核心区域,其中方法区在不同JDK版本中有永久代和元空间两种实现。堆内存是GC主要管理区域,分为新生代和老年代。HotSpot将物理内存划分为堆内(受GC管理)和堆外内存(不受GC管理),堆外内存避免了GC停顿并支持零拷贝,适用于高性能场景。三类常量池(Class文件、运行时常量池、字符串常量池)共同实现数据复用和高效访问。

2025-12-20 10:45:17 759

原创 GC进阶问题

摘要:本文系统介绍了JVM垃圾回收机制的关键技术。三色标记算法通过颜色区分对象状态,解决循环引用问题;GCRoots作为可达性分析的起点;FullGC触发条件和影响;STW机制的必要性及优化方向;浮动垃圾的产生和处理;ZGC实现低延迟的三大核心技术;逃逸分析的优化效果;卡表在分代回收中的作用。这些技术共同构成了现代JVM高效内存管理的基础,在保证系统稳定性的同时优化性能表现。

2025-12-19 09:15:34 964

原创 GC常见垃圾回收器及其相关问题

摘要:本文系统分析了Java垃圾回收机制的核心技术,重点介绍了GC日志关键指标(YGCT/FGCT/GCT)、垃圾判定算法(引用计数法与可达性分析),并对比了主流回收器特性(CMS/G1/ZGC等)。其中详细解析了G1收集器的Region划分、CSet选择机制和RememberedSet设计,以及CMS的并发标记流程和ZGC的低延迟特性。文章还阐述了并发标记中的SATB和增量更新解决方案,为Java性能优化提供了关键技术参考。

2025-12-19 09:14:59 615

原创 Java参数传递机制

Java参数传递机制解析:值传递的本质与表现 摘要:Java参数传递本质是值传递,无论基本类型还是引用类型。对于基本类型,传递的是值的副本;对于引用类型,传递的是引用地址的副本而非原地址。方法内修改基本类型副本不影响原值,而通过引用副本修改堆对象会影响原对象内容,但重新赋值引用副本不会改变原引用。JVM通过栈帧隔离和字节码指令确保值传递机制,所有参数传递都是值的复制过程。理解堆内存共享与栈帧隔离机制是掌握Java参数传递的关键。

2025-12-18 09:25:19 1105

原创 Cache Line(缓存行)核心原理与伪共享

本文深入探讨了CPU缓存行(CacheLine)的原理及其在多核编程中的关键影响。CacheLine作为CPU缓存的最小操作单元(通常64字节),基于空间局部性原理设计,其加载机制能显著提升数据访问效率。文章重点分析了伪共享问题的产生机制——当多线程并发修改同一CacheLine中的不同变量时,会触发频繁的缓存一致性同步,导致性能急剧下降。针对此问题,提出了缓存行填充、@Contended注解和变量布局优化三种解决方案。

2025-12-18 09:23:23 891

原创 Java抽象类与接口

摘要:本文系统分析了抽象类与接口的核心区别及特性。抽象类是单继承的抽象载体,可包含抽象方法、具体实现和字段,适用于类层级设计;接口是多实现的行为契约,仅定义方法约定,支持默认方法和静态方法。文章详细阐述了两者在语法规则、继承机制、方法类型、存储结构等方面的差异,并提供了解决接口冲突的优先级规则。同时给出了实践中的选型准则和使用规范,强调应根据"属性继承"和"行为跨类"需求合理选择抽象类或接口,避免常见使用误区。

2025-12-17 09:18:36 1051

原创 Java super关键字本质

Java中的super关键字用于解决继承中的成员遮蔽问题,通过强制访问父类成员突破子类同名成员的覆盖。其实现机制分为编译期符号引用绑定和运行时JVM指令解析两个阶段:编译器生成指向父类成员的符号引用,JVM通过getfield和invokespecial指令直接访问父类字段和方法,跳过动态分派实现静态绑定。

2025-12-17 09:18:08 1274

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除