- 博客(100)
- 收藏
- 关注
原创 享元模式详解--初听很抽象,实际是共享内存概念
享元模式主要是为了解决有大量相同属性的对象,通过使用同一个对象的方式减少内存的消耗,如果对象属性不相同或者对象可变不建议使用享元模式。
2025-04-02 16:16:02
374
原创 外观模式详解
门面模式主要是为了解决对外暴露接口的细节问题,通过门面的方式隐藏细节。与适配器模式不同的是,适配器模式主要是当前子系统对外部调用接口进行适配,而门面模式是内部接口开给外部的细节隐藏。门面模式是帮别人适配,适配器模式是我适配别人。
2025-04-01 11:25:22
252
原创 装饰器模式详解
装饰器模式是通过组合的方式将一个实现了共同接口或抽象类的对象进行包装,并在执行时按照装饰的顺序进行递归调用,以实现功能的动态扩展。
2025-04-01 11:07:24
409
原创 组合模式详解
组合模式是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。组合模式和桥接模式都是依赖抽象,但是组合模式更注重整体和局部的关联,而桥接模式更注重依赖抽象,不会去关注依赖对象之间的关联。
2025-03-21 11:34:55
374
原创 原型模式详解
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制已有对象来创建新对象,而不需要使用显式的构造函数调用来创建。建议学习原型可以使用debug看一下java对象地址或者对象序号。
2025-03-18 11:48:26
427
原创 工厂方法模式和抽象工厂模式详解
场景描述开发一个跨平台UI库,需要为Windows和macOS创建风格一致的按钮和文本框,并确保同一家族的产品兼容。// 抽象产品族:按钮// 抽象产品族:文本框// 具体产品:Windows按钮@OverrideSystem.out.println("Windows风格按钮渲染");// 具体产品:Windows文本框@OverrideSystem.out.println("Windows文本框输入: " + text);// 具体产品:macOS按钮@Override。
2025-03-17 17:09:05
330
原创 单例模式详解(java)
使用双重检查锁定 + volatile 确保线程安全。比纯synchronized方法性能更高。实现readResolve()方法。需要极致性能:静态内部类+防御增强。简单场景:枚举单例(JDK5+)复杂需求:本文的DCL防御增强版。构造器中增加实例存在性检查。保证反序列化返回现有实例。防御通过反射创建新实例。真正需要时才初始化实例。避免饿汉式的资源浪费。
2025-03-17 16:42:43
366
原创 如何优化SQL查询?
优化 SQL 查询需要结合 索引设计、语句重构、配置调优 和 表结构设计 多维度处理。核心原则是减少磁盘 I/O、降低 CPU 计算、合理利用内存。针对 MySQL 的特性,重点关注 B+Tree 索引、InnoDB 缓冲池、执行计划分析和 MVCC 机制。实际开发中,应通过 EXPLAIN 和慢查询日志持续监控并优化关键查询。
2025-03-08 09:43:53
878
原创 数据库事务的 ACID,通过MVCC能做什么
MVCC 核心:通过多版本和一致性视图实现无锁并发控制。解决脏读:只读取已提交的版本。解决不可重复读:事务内复用同一 Read View。解决幻读:快照读通过版本控制,当前读通过间隙锁。适用场景:读多写少的高并发系统(如电商、社交平台)。通过 MVCC,数据库在保证 ACID 特性的同时,显著提升了并发性能,是现代关系型数据库(如 MySQL、PostgreSQL)的核心并发控制机制。
2025-03-05 16:35:06
1098
原创 spring切面实现的几种方式
在Spring框架中,实现自定义注解的切面增强主要有三种方式:使用@Aspect注解、编写拦截器切面(如HandlerInterceptor)以及手动生成代理类(如JDK动态代理或CGLIB)。
2025-03-04 19:41:31
935
原创 Spring中的事务管理是如何实现的?
作用:定义事务的传播行为、隔离级别、超时时间、是否只读等属性。关键属性:传播行为(Propagation):(如 PROPAGATION_REQUIRED:如果当前没有事务,则新建事务;存在则加入)。隔离级别(Isolation):(如 ISOLATION_READ_COMMITTED:避免脏读)。超时时间(Timeout):事务的最长执行时间(秒)。只读(Read-Only):优化数据库访问(如只读查询)。
2025-03-04 15:03:00
942
原创 spring 生产bean代理对象作用
AOP 需求:在目标方法执行前后插入额外逻辑。作用域代理:确保作用域(如原型、请求、会话)的正确行为。循环依赖:通过提前暴露代理对象解决循环依赖。懒加载:延迟 Bean 的初始化,提升启动性能。事务管理:通过代理对象实现声明式事务管理。
2025-03-04 14:49:56
502
原创 Spring Boot 自动配置原理及 MyBatis Mapper 自动注册源码解析
Mapper // 标记为 MyBatis Mapper@MapperScan("com.example.mapper") // 显式指定扫描包启动阶段:@SpringBootApplication 包含 @EnableAutoConfiguration,触发加载 MybatisAutoConfiguration。MybatisAutoConfiguration 检查条件(数据源、MyBatis 类是否存在)。
2025-03-03 19:45:54
792
原创 MyBatis如何使用jdk动态代理结合mapper的配置文件生成类,从源码分析
启动阶段:解析所有 Mapper XML 文件,创建 MappedStatement 并注册到 Configuration。为每个 Mapper 接口创建 MapperProxyFactory,存入 MapperRegistry。运行时调用:调用 sqlSession.getMapper(UserMapper.class)。通过 MapperProxyFactory 生成代理对象(JDK 动态代理)。
2025-03-03 19:44:03
590
原创 Spring Bean 的生命周期
生命周期价值:通过钩子方法(如 @PostConstruct、@PreDestroy)精确控制 Bean 的初始化和销毁逻辑。适用场景:资源管理、数据预热、配置校验、监控日志、动态注册等需与容器生命周期同步的操作。最佳实践:优先使用标准注解(而非接口)降低耦合,确保逻辑轻量以避免启动延迟。
2025-02-28 09:35:15
642
原创 Spring doScan源码详解
作用:扫描指定的包路径,查找候选 Bean 并注册到容器。参数:basePackages 表示要扫描的基础包路径(如 com.example.service)。返回值:包含所有注册的 Bean 定义及其名称的集合(BeanDefinitionHolder)。作用:调用 findCandidateComponents 扫描包路径下的类文件,识别带有注解(如 @Component)的类,生成 BeanDefinition。
2025-02-27 11:48:02
739
原创 从源码角度解析 Spring 中的 IoC 和 AOP
功能 核心类/接口 作用IoC 容器 ApplicationContext 管理 Bean 的生命周期和依赖关系Bean 定义解析 AnnotatedBeanDefinitionReader 解析 @Component、@Bean 注解依赖注入 AutowiredAnnotationBeanPostProcessor 处理 @Autowired 和 @Value 注入AOP 代理生成 AnnotationAwareAspectJAutoProxyCreator 创建动态代理对象。
2025-02-25 19:16:01
789
原创 spring IOC关键步骤详解
核心流程扫描类路径:入口:ClassPathBeanDefinitionScanner#scan,扫描指定包下的类。过滤条件:通过 @Component、@Service 等注解标记的类会被识别为候选 Bean。// 扫描类路径,解析带有@Component的类解析注解生成 BeanDefinition:通过 AnnotatedBeanDefinitionReader 解析 @Configuration、@Bean 等注解。// 生成 BeanDefinition。
2025-02-25 19:15:25
872
原创 类加载机制与双亲委派模型详解
类加载机制:负责将类的字节码加载到内存并生成Class对象。通过委派机制确保类的唯一性和安全性,防止核心类库被篡改。这个可以了解一下,可以理解为什么自己写一个String类型无法篡改原生的String。
2025-02-25 11:12:58
238
原创 如何使用java自带工具排查内存泄漏(后续实战)
监控工具:优先用 jstat 观察内存趋势,jmap 生成堆转储。分析工具:VisualVM 或 JProfiler 图形化分析更高效。核心思路:找到无法回收的大对象,通过引用链定位代码中的持有者。高频场景:静态集合、缓存未清理、监听器未注销、线程池未关闭等。
2025-02-19 18:22:04
755
原创 java垃圾回收器学习
经过不断的更新换代,主要使用的还是G1垃圾回收器,大家可以主要去了解下其相关源码,其他垃圾回收器可以适当学习。G1 垃圾回收器(Garbage-First GC)
2025-02-17 15:52:37
660
原创 G1 垃圾回收器 垃圾回收流程,是使用什么算法进行回收的,优劣势
G1通过分Region、并发标记和增量回收策略,在可控停顿时间内高效管理内存。其优势在于灵活性和低延迟,但需权衡内存开销和调优复杂度。理解其机制有助于针对应用场景优化JVM参数,最大化性能表现。
2025-02-17 15:25:02
1293
原创 程序计数器的部分疑问
程序计数器是在编译成字节码的时候确认的,意味着在运行态是不可变的,反馈到底层上面,就是一堆寄存器汇编指令,进行方法的跳转,偏移以及赋值,其中的内存地址在发生变化而已。
2025-02-15 17:40:49
639
原创 JVM的内存模型(堆、栈、方法区等)?对比C++内存模型有什么区别?jvm调优方向
JVM 内存模型:更加抽象和自动化,尤其是垃圾回收机制。分为堆、栈、方法区、程序计数器和本地方法栈。适合开发高可靠性和高安全性的应用程序。C++ 内存模型:更加灵活和底层,需要程序员手动管理内存。分为栈、堆、全局/静态存储区、常量存储区和代码区。适合开发高性能和低延迟的应用程序。通过合理的 JVM 调优和异常处理,可以提高 Java 应用程序的性能和稳定性。
2025-02-15 17:12:12
608
原创 初步了解jvm中栈的作用,以及实际调用中,栈和程序计数器的交互
栈 是线程私有的内存区域,每个线程在创建时都会分配一个独立的栈。栈用于存储方法的局部变量、操作数栈、动态链接和方法返回地址等信息。栈的大小是固定的,可以通过 JVM 参数 -Xss 配置(例如 -Xss1m 表示栈大小为 1MB)。程序计数器 是线程私有的内存区域,用于记录当前线程执行的字节码指令地址。每个线程有独立的程序计数器。是 JVM 中唯一一个不会发生内存溢出的区域。栈:用于存储方法的局部变量、操作数栈、动态链接和方法返回地址。
2025-02-15 17:06:45
862
原创 Java中的原子类(AtomicInteger等)是如何实现的?
Java 中的原子类(如 AtomicInteger、AtomicLong、AtomicReference 等)是基于 CAS 操作实现的。CAS 操作通过 Unsafe 类提供的本地方法实现,确保多线程环境下的线程安全性。原子类的核心思想是 无锁并发,通过硬件指令实现原子操作,避免了锁的开销。CAS 操作虽然高效,但也存在 ABA 问题和自旋开销等缺点,需要根据具体场景选择合适的解决方案。
2025-02-15 10:18:02
552
原创 从java内存模型图讲下volatile关键字的作用?
从 Java 内存模型的角度来看,volatile 关键字的作用主要包括:保证可见性:强制线程从主内存中读取 volatile 变量的最新值。强制线程将 volatile 变量的修改立即写回主内存。禁止指令重排序:通过内存屏障确保 volatile 变量的读写操作不会被重排序。volatile 该语法糖就是将修饰变量的读写强制从工作刷回主内存,并且防止被指令重排序,防止多线程情况下代码与预期结果不符。
2025-02-14 16:19:49
349
原创 unsafe.compareAndSwapObject简单了解
参数含义作用obj目标对象指定要操作的对象offset字段偏移量指定要操作的字段在对象内存中的位置expect期望的字段当前值检查字段的当前值是否等于 expectupdate要更新的字段新值如果当前值等于 expect,则更新为 updatecompareAndSwapObject 是 Unsafe 类中实现 CAS 操作的核心方法,广泛用于无锁并发编程中(如 AQS、原子类等)。通过 CAS 操作,可以避免使用锁,提高并发性.
2025-02-13 20:25:18
472
原创 AQS实现公平锁的底层逻辑
公平锁的核心是 按顺序获取锁,通过 hasQueuedPredecessors() 方法检查是否有其他线程在等待队列中排队。公平锁的实现需要子类重写 tryAcquire(int acquires) 方法,并在获取锁时检查等待队列。公平锁保证了线程的公平性,但性能较低;非公平锁性能较高,但可能导致线程饥饿。通过 AQS 的灵活设计,可以轻松实现公平锁和非公平锁,满足不同的业务需求。
2025-02-13 16:33:44
597
原创 java中锁的区别,以及AQS机制
实现机制:AQS 是 java.util.concurrent.locks 包中的一个抽象类,用于构建锁和同步器。它是 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch 等同步工具的基础。底层实现:AQS 内部维护了一个 双向队列(CLH 队列) 和一个 状态变量(state)。状态变量用于表示锁的状态(如锁的持有次数)。当一个线程尝试获取锁时:如果锁未被占用,线程会成功获取锁,并更新状态变量。
2025-02-12 17:27:32
1092
原创 如何创建线程?Runnable和Callable的区别?
创建线程的方式:继承 Thread 类。实现 Runnable 接口。实现 Callable 接口。使用线程池。Runnable 和 Callable 的区别:Runnable 无返回值,不能抛出受检异常。Callable 有返回值,可以抛出受检异常。适用场景:如果任务不需要返回结果,使用 Runnable。如果任务需要返回结果或抛出异常,使用 Callable。通过合理选择线程创建方式和任务接口,可以更好地满足多线程编程的需求。
2025-02-12 15:58:36
513
原创 Java中的Fail-Fast和Fail-Safe机制是什么?
Fail-Fast:快速发现并发修改问题,适用于单线程环境。实现简单,性能较高,但在多线程环境下可能抛出异常。Fail-Safe:避免因并发修改导致异常,适用于多线程环境。实现复杂,性能较低,但更适合高并发场景。根据具体的使用场景选择合适的机制,可以有效提高程序的健壮性和性能。一句话:Fail-Fast的目的是为了快速抛出错误让程序感知,而Fail-Safe的目的是程序进行容灾,避免因为异常导致程序停止。
2025-02-12 10:26:55
505
原创 源码角度分析下ConcurrentHashMap是如何实现线程安全的?
ConcurrentHashMap 通过以下机制实现线程安全:CAS:用于无锁化的更新操作。synchronized:锁定单个桶的头节点,减少锁粒度。volatile:保证变量的可见性。多线程协作扩容:提高扩容效率。相比于 Hashtable 和 Collections.synchronizedMap,ConcurrentHashMap 在并发性能上有显著优势,适合高并发场景。
2025-02-11 19:46:41
1194
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人