- 博客(38)
- 收藏
- 关注
原创 Future和CompletableFuture详解
Future:表示一个异步计算的结果,提供了检查计算是否完成、等待计算完成、获取计算结果的方法。核心思想同步调用:main线程 ──────→ 调用方法 ──────→ 等待返回 ──────→ 继续执行|_____耗时操作_____|异步调用(Future):main线程 ──────→ 提交任务 ──────→ 继续执行其他逻辑 ──────→ get()获取结果↓工作线程执行任务(异步)// 取消任务// 任务是否被取消// 任务是否完成// 获取结果(阻塞)
2025-10-27 20:52:02
594
原创 MySQL锁机制
数据库锁:是数据库用来协调多个事务(或进程)并发访问某一资源的机制。为什么需要锁?🔒 保证数据一致性🔒 防止脏读、不可重复读、幻读🔒 协调并发访问,避免数据冲突全局锁:锁定整个数据库实例,使其处于只读状态。MDL:MySQL 5.5引入,用于保护表的元数据(表结构),自动加锁。意向锁:表级锁,用于表示事务打算对表中某些行加什么类型的锁。-- 假设表中有记录:id = 1, 5, 10主键索引:间隙 记录 间隙 记录 间隙 记录 间隙间隙包括:1. (-∞, 1)2. (1, 5)
2025-10-25 15:03:53
827
原创 synchronized锁优化与升级机制
锁状态Mark Word获取方式释放方式适用场景无锁无竞争偏向锁CAS一次撤销时处理单线程反复进入轻量级锁CASCAS交替执行重量级锁Monitor|10MonitorMonitor竞争激烈答:偏向锁是一种针对加锁操作的优化手段。假设某个锁大部分时间都是被同一个线程获取,那么这个锁就"偏向"这个线程。偏向锁使用CAS一次性将线程ID记录在对象头中,之后该线程再次进入时只需检查线程ID,无需CAS,大大提高了性能。
2025-10-25 15:00:03
847
原创 park和unpark机制详解
是用来创建锁和其他同步类的线程原语位置作用🔧 提供更灵活的线程阻塞和唤醒机制🔧 是构建其他并发工具的基础(如AQS)🔧 比wait/notify更强大和易用// 尝试获取锁if (!// 获取失败,park等待// 唤醒所有等待的线程(实际应该维护等待队列)// 这里简化处理特性说明无需synchronized可以在任何地方调用精确唤醒unpark(thread)精确唤醒指定线程。
2025-10-25 14:42:47
862
原创 wait和notify机制详解
方法作用注意事项wait()释放锁并等待必须在synchronized块中notify()唤醒一个等待的线程不立即释放锁唤醒所有等待的线程更安全,推荐使用。
2025-10-25 14:21:36
756
原创 Java创建线程的三种方式
/ 定义线程类@Override// 线程要执行的任务i < 100;i++) {" 执行:" + i);// 使用线程// 创建线程对象// 启动线程(注意:必须调用start(),不是run())t1.start();t2.start();// 主线程继续执行i < 100;i++) {System.out.println("main线程执行:" + i);
2025-10-25 13:35:13
878
原创 JMM-----java内存模型
Java内存模型(Java Memory Model,JMM):是一种抽象的概念,实际上并不存在,描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问方式。核心问题:JMM解决的是多线程并发访问共享变量时的可见性、原子性和有序性问题。JMM内存模型:├─ 主内存:所有线程共享└─ 工作内存:线程私有8种原子操作:├─ lock/unlock:锁定/解锁├─ read/load:读取/载入├─ use/assign:使用/赋值。
2025-10-25 00:01:31
872
原创 Spring容器的实现
摘要:本文介绍了Spring框架中BeanFactory的实现机制及其功能扩展方式。BeanFactory通过BeanDefinition创建bean,但默认缺少解析注解的能力,需通过后处理器实现功能扩展。后处理器在bean生命周期各阶段提供扩展支持,如依赖注入(@Autowired/@Resource)。文章还对比了不同ApplicationContext实现类,包括基于XML配置的ClassPathXmlApplicationContext、基于注解的AnnotationConfigApplicatio
2025-10-14 15:36:37
647
原创 Spring容器的接口
ApplicationContext间接继承了BeanFactoryBeanFactory才是Spring的核心容器,ApplicationContext的实现只是组合它的功能beanFactory是ApplicationContext的成员变量DefaultListableBeanFactory作为BeanFactory的实现类提供基本的依赖注入、控制反转、Bean的生命周期。
2025-10-14 14:17:51
530
原创 对象创建流程
Java 对象的创建过程从 “类的合法性校验” 到 “内存分配与安全控制”,再到 “底层初始化” 和 “业务初始化”,完整覆盖了从字节码指令到可用实例的全流程,既保证了 JVM 运行时的规范性,也满足了业务逻辑对对象状态的要求。
2025-09-29 18:56:36
1016
原创 设计模式学习笔记-----抽象责任链模式
该文介绍了一种基于Spring的抽象责任链模式实现方案,由5个核心组件构成:上下文(AbstractChainContext)作为调度中心,处理器容器(abstractChainHandlerContainer)按业务分组管理处理器,处理器抽象接口(AbstractChainHandler)定义规范,业务专属接口(UserRegisterCreateFilter)固化业务分组,以及具体处理器实现业务逻辑。系统通过Spring自动配置和CommandLineRunner实现处理器自动注册和排序,在业务调用时按
2025-08-26 14:09:16
1304
原创 设计模式学习笔记-----抽象策略模式
本文介绍了一种基于Spring框架的抽象策略模式实现方案。该方案由策略接口、策略选择器、自动配置类、策略模板类和具体策略类五部分组成。策略接口定义统一规范,提供默认方法降低实现成本;策略选择器负责策略的注册、查找和执行调度;自动配置类整合Spring容器实现自动装配;策略模板类封装通用逻辑;具体策略类实现特定业务逻辑。该方案通过组件化设计实现了策略的自动化管理,具有高度解耦、扩展灵活的特点,适用于业务场景多变的系统开发。
2025-08-26 13:46:20
615
原创 JUC学习笔记-----线程池
摘要 ThreadPoolExecutor线程池的核心机制包括:1)使用高3位表示5种线程池状态(RUNNING/TERMINATED等),低29位记录线程数;2)通过构造参数控制线程数、队列类型和拒绝策略;3)任务处理流程遵循"核心线程→队列→救急线程→拒绝"的优先级;4)提供多种任务提交方式(execute/submit/invokeAll等);5)支持有序关闭(shutdown)和强制终止(shutdownNow)。JDK预置的Fixed/Cached/SingleThreadPo
2025-08-21 13:15:54
1465
原创 JVM学习笔记-----类加载
什么时候需要自定义类加载器1)想加载非 classpath 随意路径中的类文件2)都是通过接口来使用实现,希望解耦时,常用在框架设计3)这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于 tomcat 容器1. 继承 ClassLoader 父类2. 要遵从双亲委派机制,重写 findClass 方法 注意不是重写 loadClass 方法,否则不会走双亲委派机制3. 读取类文件的字节码4. 调用父类的 defineClass 方法来加载类。
2025-08-18 21:19:02
1092
原创 JVM学习笔记-----StringTable
本文详细解析了Java字符串常量池(StringTable)的运行机制和优化策略。首先介绍了字符串从符号到对象的转换过程,以及StringTable的哈希表结构特性。重点分析了不同JDK版本中字符串创建和intern()方法的差异:JDK7+会将堆中对象引用放入常量池,而JDK6会在永久代创建新对象。通过多个字符串比较示例,展示了编译期优化、动态拼接和intern方法的实际效果。最后提供了StringTable调优建议,包括调整哈希表大小、合理使用intern方法等,并指出大字符串和不常用字符串不适合入池。
2025-08-17 14:23:19
1414
原创 JUC学习笔记-----LongAdder
LongAdder是一种高并发计数器,通过分段累加策略优化多线程竞争场景。其核心结构包括:1)基础值base用于无竞争时直接累加;2)Cell数组分散线程竞争,通过哈希分配不同Cell;3)cellsBusy自旋锁控制数组初始化/扩容。采用@Contended注解避免缓存行伪共享,每个Cell独占缓存行。add()方法优先CAS累加base,失败则分段处理,冲突加剧时触发longAccumulate进行数组扩容或重试。sum()合并base和所有Cell值,牺牲强一致性换取更高吞吐。整体设计在竞争激烈时性能
2025-08-15 13:04:03
1378
原创 JUC学习笔记-----LinkedBlockingQueue&&ConcurrentLinkedQueue&&CopyOnWriteArrayList
LinkedBlockingQueue采用双锁机制分离入队和出队操作,实现生产者和消费者的并发执行。它使用链表结构,通过Dummy节点简化操作,动态创建节点实现懒初始化。相比ArrayBlockingQueue的单锁设计,具有更高的并发性能。此外,CopyOnWriteArrayList采用写时拷贝技术,保证读操作不加锁,适合读多写少场景,但存在弱一致性问题。两者都通过特定设计平衡了并发性能与线程安全,适用于不同的应用场景。
2025-08-14 21:06:10
785
原创 JUC学习笔记-----ConcurrentHashMap
本文详细解析了Java中ConcurrentHashMap在JDK7和JDK8的实现原理与使用方式。JDK7采用分段锁机制,通过Segment数组实现并发控制,每个Segment相当于一个小型HashMap;JDK8则优化为更细粒度的锁+CAS操作,引入红黑树提升查询效率。文章重点分析了put/get/扩容等核心流程,对比了两版本在锁机制、数据结构、扩容方式等方面的差异,并提供了正确使用建议:避免直接使用get+put非原子操作,推荐使用computeIfAbsent等原子方法;JDK8通过LongAdde
2025-08-14 14:04:14
1343
原创 设计模式学习笔记-----单例模式
单例模式是一种确保类只有一个实例并提供全局访问点的设计模式。常见实现方式包括:1)饿汉式(类加载时创建实例,线程安全但可能浪费资源);2)枚举饿汉式(利用枚举特性防止反射/序列化破坏);3)懒汉式(延迟加载,需处理线程安全问题);4)DCL双重检查锁(volatile防止指令重排序);5)静态内部类(利用类加载机制保证线程安全)。JDK中典型应用包括Runtime(饿汉)、System(DCL)和Collections(内部类)等。每种实现各有优劣,需根据线程安全、性能、序列化等需求选择。
2025-08-13 00:51:15
932
原创 JVM学习笔记-----图解方法执行流程
文章摘要:本文通过两个Java代码示例分析字节码执行过程。第一个示例展示常量池加载、操作数栈使用和局部变量存储过程,包括bipush/ldc指令加载值、istore存储变量、iadd执行加法等操作。第二个示例重点分析a++和++a的区别,通过字节码指令iinc和iload的执行顺序来解释两者差异。演示了从类加载到方法执行完毕的完整字节码执行流程,包括常量池加载、栈帧分配、操作数栈操作等JVM底层机制。
2025-08-12 16:23:23
362
原创 面试题-----RabbitMQ
摘要:文章探讨了RabbitMQ保证消息不丢失的解决方案,包括生产者确认机制、消息持久化和消费者确认机制。针对消息重复消费问题,提出了通过业务唯一标识实现幂等处理的方法。同时介绍了死信交换机和TTL实现延迟队列的方案,以及处理消息堆积的三种方式:提升消费能力、增加消费者和使用惰性队列。最后提及RabbitMQ的高可用机制,涵盖了从生产到消费全流程的消息可靠性保障措施。(150字)
2025-08-11 23:36:05
780
原创 面试题-----微服务业务
本文主要介绍了分布式系统中的限流、分布式事务和任务调度等关键技术。在限流方面,文章分析了Tomcat、Nginx和网关等实现方式,比较了令牌桶和漏桶算法的原理及适用场景。对于分布式事务,详细阐述了Seata框架的XA、AT和TCC三种模式的工作原理及优缺点,并介绍了MQ事务方案。此外,还探讨了接口幂等性的设计方法,包括Token+Redis和分布式锁等实现策略。最后简要介绍了XXL-JOB分布式任务调度框架及其路由策略。这些技术方案为构建高并发、高可用的分布式系统提供了重要参考。
2025-08-11 21:58:07
1214
原创 JUC学习笔记-----ReentrantLock
ReentrantLock原理分析:本文详细解析了Java中ReentrantLock的实现机制。1)非公平锁实现:通过CAS操作竞争锁,失败后进入AQS队列自旋等待,包括加锁失败流程、解锁竞争流程和可重入原理;2)公平锁实现:在获取锁前会检查等待队列;3)条件变量实现:通过ConditionObject维护等待队列,实现await/signal机制。文章还分析了可打断与不可打断模式的区别,以及线程在等待过程中被中断的处理逻辑。整个实现基于AQS框架,通过state变量控制锁状态,使用Node队列管理等待线
2025-08-10 21:59:39
1409
原创 面试题-----Spring Cloud
本文总结了Spring Cloud的核心组件及其功能,包括服务注册与发现(Eureka/Nacos)、负载均衡(Ribbon)、远程调用(Feign)、熔断保护(Hystrix/Sentinel)和API网关(Zuul/Gateway)。重点比较了Nacos与Eureka的异同,Nacos除注册中心功能外还支持配置管理和主动健康检测。文章详细介绍了Ribbon的负载均衡策略(轮询、加权响应、随机、区域感知)及其实现方式,并解释了服务雪崩的应对措施(降级和熔断机制)。最后以订单服务调用用户服务为例,说明了负载
2025-08-09 21:37:40
1159
原创 Redis学习笔记-----Redis内存回收
Redis内存回收机制解析:Redis通过惰性删除和周期删除策略实现高效内存回收,包含SLOW和FAST两种模式。SLOW模式定期扫描(默认10次/秒),单次耗时≤25ms,抽样检查过期key;FAST模式在事件循环前执行(间隔≥2ms),耗时≤1ms,仅当过期key超10%时触发。内存淘汰策略在命令执行前检查,采用LRU/LFU/TTL时通过eviction_pool优先淘汰闲置key,RANDOM策略则直接随机删除。LFU计数采用概率递增和时间衰减机制,平衡性能与精准度。
2025-08-08 01:12:13
1493
原创 Redis学习笔记-----主从同步原理
Redis主从同步分为全量和增量两种模式。首次同步采用全量同步:1)建立连接后,master生成RDB快照发送给slave;2)slave清空本地数据加载RDB;3)master补充发送RDB生成期间积压的命令。后续同步采用增量同步:1)slave重启后发送保存的replid和offset;2)master校验通过后,从repl_backlog环形缓冲区提取未同步命令;3)slave执行这些命令完成数据同步。repl_backlog通过offset机制确保命令不丢失,缓冲区写满时会循环覆盖旧数据。
2025-08-07 22:10:26
803
原创 Redis学习笔记-----Redis持久化
Redis持久化包含RDB和AOF两种方式:RDB通过定时快照实现,fork子进程利用写时复制机制生成压缩的二进制文件,恢复速度快但存在数据丢失风险;AOF通过记录写命令实现,数据完整性更高但文件体积大、恢复速度慢。RDB适合可容忍数据丢失、追求快速恢复的场景,AOF适合对数据安全性要求高的应用。两者在资源占用、性能影响等方面各有特点,实际应用中常结合使用以兼顾数据安全与性能。
2025-08-07 21:21:55
865
原创 面试题-----Spring事务失效的几种场景及原因
Spring事务失效的常见场景包括:1.抛出检查异常未配置rollbackFor属性,导致事务不回滚;2.方法内部try-catch异常未重新抛出或手动回滚;3.AOP切面顺序不当导致异常未被事务切面捕获;4.非public方法无法被代理;5.父子容器扫描范围冲突;6.同类方法调用绕过代理;7.普通select语句不保证原子性;8.synchronized与事务范围不一致。解决方案包括:配置rollbackFor、正确处理异常、调整切面顺序、使用public方法、规范容器扫描、通过代理调用方法、使用sele
2025-08-05 20:52:18
778
原创 面试题-----Spring bean的生命周期
本文系统介绍了Spring Bean的生命周期管理机制,包括七个关键阶段:1. 名称处理(别名解析、FactoryBean规范、三级缓存机制);2. 父子容器查找规则;3. dependsOn依赖控制;4. Scope作用域管理(singleton/prototype/request);5. 创建流程(实例化、依赖注入、初始化、销毁注册);6. 类型转换;7. 销毁机制。重点解析了循环依赖的三级缓存解决方案、父子容器隔离特性、多种依赖注入方式(@Autowired/@Resource)、初始化回调顺序(Aw
2025-08-05 15:06:29
1307
原创 面试题-----spring_refresh调用流程
本文详细解析了Spring框架中refresh()方法的执行流程,该方法负责初始化Spring容器。主要步骤包括:准备环境、创建BeanFactory、配置BeanFactory、执行工厂后处理器、注册Bean后处理器、初始化消息源和事件广播器、实例化单例Bean等。其中重点关注了BeanFactory的初始化过程、各种处理器(BeanFactoryPostProcessor/BeanPostProcessor)的作用、国际化支持和事件机制实现。整个流程体现了模板方法设计模式,通过钩子方法为子类提供扩展点,
2025-08-04 22:27:13
766
原创 JUC学习笔记-----ThreadLocal
ThreadLocal是Java中用于实现线程局部变量的工具类,它能为每个线程提供独立的变量副本,实现线程间的数据隔离。通过set()、get()和remove()方法操作线程内部的ThreadLocalMap存储结构,其中key为ThreadLocal的弱引用,value为强引用。与synchronized同步机制不同,ThreadLocal采用"空间换时间"策略,避免了锁竞争。使用时需注意内存泄漏风险,建议配合remove()方法及时清理。核心原理是通过Thread类内部的Threa
2025-08-04 14:41:01
1376
原创 Redis学习笔记-----Redisson原理
Redisson分布式锁通过哈希结构实现可重入特性,支持锁重试和WatchDog自动续期机制。其核心原理包括:1. 使用Lua脚本原子性操作Redis哈希结构记录线程标识和重入次数;2. 通过订阅发布机制实现锁等待和重试;3. 采用定时任务定期续期避免锁过期。针对主从一致性问题,Redisson提供联锁方案,要求同时获取多个独立节点的锁。该方案在保证分布式锁特性的同时,提供了可重入、自动续期和故障恢复等能力。
2025-08-03 21:22:06
1048
原创 MYSQL学习笔记-----InnoDB引擎
InnoDB事务机制通过redo log和undo log实现ACID特性。redo log采用顺序写保证事务持久性,在崩溃恢复时重放日志;通过先写日志延迟刷盘提升写入性能,采用循环写入方式管理日志空间。undo log记录数据变更前状态,支持事务回滚和MVCC实现,通过版本链为不同事务提供数据快照,实现非锁定读。InnoDB提供四种隔离级别:读未提交(可能脏读)、读已提交(避免脏读)、可重复读(默认级别,通过MVCC和间隙锁避免幻读)、串行化(完全串行)。MVCC机制依赖隐藏字段、undo log版本链和
2025-08-03 14:02:33
1137
原创 垃圾回收学习笔记-----垃圾回收调优
【摘要】垃圾回收调优需要掌握GC相关VM参数及监控工具,明确优化目标(低延迟或高吞吐量)。调优核心在于减少GC发生,需关注数据量控制、对象结构优化和内存泄漏排查。新生代调优应平衡堆内存大小(建议占总堆25%-50%),避免频繁MinorGC或过早对象晋升。老年代调优需处理内存碎片和并发回收问题。典型案例分析展示了不同场景的解决方案:调整分代内存比例、优化CMS参数、处理永久代溢出等。通过合理配置晋升阈值和监控年龄分布,可有效提升系统性能。
2025-08-02 21:17:39
759
原创 垃圾回收学习笔记-----垃圾回收器
本文系统介绍了Java四种主流垃圾回收器的工作原理与特性:1.串行回收器(Serial GC)采用单线程STW方式,适合小内存场景;2.吞吐量优先回收器(Parallel GC)通过多线程优化吞吐量,适用于计算密集型任务;3.响应时间优先回收器(CMS)采用并发标记减少停顿,但存在内存碎片问题;4.G1回收器创新性地采用分区域收集和并发标记机制,通过MixedGC平衡停顿时间与吞吐量,支持大堆内存。文章详细解析了各回收器的触发条件、工作阶段、核心算法(如标记-复制、标记-清除)及关键JVM参数配置,并比较了
2025-08-02 13:43:26
775
原创 垃圾回收学习笔记-----分代回收
分代垃圾回收根据对象生命周期将堆内存划分为新生代和老年代。新生代分为Eden区和两个Survivor区,新对象首先分配在Eden区,触发MinorGC时存活对象会被复制到Survivor区并增加年龄,达到阈值(默认15)后晋升到老年代。老年代采用不同回收算法(如标记-整理),触发FullGC时STW时间更长。这种设计通过针对不同代采用最优回收策略,提高了垃圾回收效率,减少了停顿时间,符合大多数对象"朝生夕灭"的特性。
2025-08-02 01:20:24
1166
原创 垃圾回收学习笔记-----垃圾回收算法
本文介绍了三种主流垃圾回收算法。标记-清除算法通过标记存活对象后直接回收垃圾,速度快但会产生内存碎片;标记-整理算法在标记后移动存活对象进行内存整理,解决了碎片问题但效率较低;复制算法将存活对象复制到备用内存区,无碎片但内存利用率低。三种算法各具特点:标记-清除适合对象存活率低的年轻代,标记-整理适合存活率高的老年代,复制算法适合对象短暂存活的Eden区。实际应用中需根据内存特性和性能需求选择合适的回收策略。
2025-08-02 00:21:13
716
原创 垃圾回收学习笔记-----如何判断对象可以回收
摘要: 垃圾回收(GC)判断对象可回收性的主要方法包括引用计数法和可达性分析算法。引用计数法通过记录对象被引用次数,归零时回收,但无法解决循环引用问题;Java采用可达性分析算法,从GC Roots(如栈帧变量、静态属性、常量等)出发扫描对象引用链,未被引用的对象可回收。此外,Java提供四种引用类型:强引用(不回收)、软引用(内存不足时回收)、弱引用(GC即回收)和虚引用(仅回收通知),配合引用队列可优化资源管理。终结器引用(FinalReference)是JVM内部机制,用于触发finalize()方法
2025-08-01 22:57:20
668
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅