- 博客(31)
- 收藏
- 关注
原创 Spring事务
Spring事务通过AOP代理实现,核心是PlatformTransactionManager事务管理器。提供编程式(TransactionTemplate)和声明式(@Transactional)两种管理方式。声明式事务通过代理拦截方法,在调用前开启事务、执行方法、异常回滚/正常提交。常见失效场景包括:同类内部调用、非public方法、未配置事务管理器、final类/方法、异常类型不匹配等。需特别注意事务传播行为和异常处理配置,确保事务正确生效。
2025-09-18 07:30:00
844
原创 Spring Bean的生命周期
Spring Bean生命周期包括:实例化容器调用构造方法创建对象;属性填充注入依赖;Aware接口注入容器信息;BeanPostProcessor前置处理;执行InitializingBean和init-method初始化;BeanPostProcessor后置处理(如AOP代理);完成初始化后投入使用;容器关闭时调用DisposableBean和destroy-method释放资源。整个过程确保了Bean的完整创建、初始化和销毁管理。
2025-09-17 22:00:00
266
原创 Java循环依赖
Spring通过三级缓存机制解决单例Bean的setter/字段注入循环依赖问题。其中一级缓存存放完整Bean,二级缓存存放半成品Bean,三级缓存放工厂用于生成早期引用(支持AOP代理)。对于构造器注入和多例Bean的循环依赖,需通过重构、@Lazy延迟注入或ObjectProvider等方式处理。最佳实践是减少强耦合,优先从设计层面避免循环依赖。
2025-09-17 07:15:00
965
原创 Spring IOC 与 Spring AOP
摘要:Spring框架通过IoC(控制反转)和AOP(面向切面编程)实现解耦与模块化。IoC容器负责对象创建与依赖注入,降低耦合度;AOP则将横切关注点(如日志、事务)从业务逻辑中分离,通过动态代理(JDK/CGLIB)实现织入。Spring AOP提供@Aspect等注解定义切面,支持多种通知类型。相比静态代理,动态代理更灵活高效。与功能更强大的AspectJ相比,Spring AOP轻量易用,适合大多数企业场景。IoC设计需考虑生命周期管理、依赖注入方式、作用域支持等核心机制。
2025-09-16 22:00:00
1499
原创 Spring框架的特点
你可以在普通的 Java 应用中通过引入相关依赖就使用其功能,而不需要依赖重量级的应用服务器(如早期的 EJB 容器)。Spring 通过 IoC 容器管理对象的创建与依赖关系(通过构造器注入、Setter 注入或注解注入),将对象的生命周期与组装交给容器负责。Spring 的 AOP 能把横切关注点(如事务、日志、安全、性能监控)从业务逻辑中抽离出来,通过代理方式在运行时织入。使用 @Transactional 注解或配置,结合 AOP 自动处理事务的开启/提交/回滚,业务代码无需侵入事务逻辑。
2025-09-16 13:57:50
338
原创 Redis常见数据结构
位图结构,允许以二进制方式存储大量的布尔值(0 或 1),特别适用于大规模布尔型数据的高效存储与位运算。日志数据结构,适用于消息队列和事件流处理,支持时间顺序存储、消费数据,并支持消费者组和消息持久化。应用场景:缓存对象、计数器、分布式锁、共享 session 信息等;应用场景:用户积分排行榜、任务优先级调度、推荐系统的权重排序等;应用场景:缓存对象(如用户信息)、购物车、配置项等;应用场景:位置服务、附近的人、地理围栏等;
2025-09-08 14:38:41
341
原创 MySQL性能调优
本文介绍了MySQL性能优化方法,重点解析了EXPLAIN工具的使用,包括执行计划参数、type扫描类型和extra字段含义。针对性能优化,提出了7个方案:1)通过慢查询日志定位瓶颈;2)优化索引设计;3)改进查询逻辑;4)深分页优化技巧;5)大表拆分策略;6)使用缓存技术;7)其他优化手段如分库分表、参数调优等。文章强调通过索引覆盖、避免全表扫描、合理设计联合索引等方法提升查询效率,同时针对不同场景给出了具体优化建议。
2025-09-07 20:26:22
1404
原创 MySQL中有哪些锁
持有期间阻塞所有 DML 和 DDL,长时间持有会导致业务阻塞。:允许普通业务读写,仅阻止破坏性操作(如实例关闭、表结构变更等):由 ALTER 等 DDL 操作触发,与任何锁互斥。:IS 与 IX 可共存,与表读锁兼容,与表写锁互斥。:MDL 在事务结束时释放,长事务会阻塞 DDL。:自动加锁,保证 DDL 与 DML 操作互斥。:由 DML 语句触发,表明意图加行级 X 锁。:由 SELECT 等读操作触发,可共存。:协调表级锁与行级锁,提升检测效率。:与 S 锁兼容,与 X 锁互斥。
2025-09-06 22:50:10
376
原创 MVCC(多版本并发控制)
MVCC 通过版本链(基于 undo log 和隐藏列)和 Read View(可见性判断规则),实现了并发事务对数据的非阻塞读。其中,Read View 的四个字段定义了 “可见性边界”,而不同隔离级别通过控制 Read View 的生成时机,平衡了并发性能与数据一致性(如 RR 的 “重复读” 与 RC 的 “实时读”)。这种机制让 InnoDB 在高并发场景下,既能保证事务隔离性,又能避免读操作的锁阻塞,大幅提升了数据库性能。
2025-09-06 21:01:34
1274
原创 为什么MySQL可重复读级别不能完全避免幻读
摘要:可重复读(RR)隔离级别通过MVCC快照读避免不可重复读,但无法完全消除幻读问题。快照读基于事务启动时的ReadView,不加锁,读取历史版本;当前读(FOR UPDATE等)则加间隙锁保证数据一致性。RR级别下幻读可能发生在:1)快照读后其他事务插入新数据;2)随后执行当前读时看到这些新数据。间隙锁仅在当前读时生效,且依赖索引范围,若未覆盖所有间隙仍可能出现幻读。因此,RR级别是幻读与性能的权衡方案,而非100%防幻读。(149字)
2025-09-05 15:58:15
784
原创 MySQL并发相关问题
实现:每个查询语句执行前重新生成 “Read View”(数据版本视图),仅可见已提交的事务版本;实现:事务启动时生成唯一 Read View,整个事务周期内复用该视图,屏蔽后续提交的修改;Mysql提供了多种锁机制来保证数据的一致性,如行锁、表锁、意向锁、间隙锁、临键锁等。适用场景:对一致性有基础要求,需高并发的业务(如电商商品详情)。定义:事务执行期间,多次读取同一数据的结果始终与事务启动时一致;一致性:存在脏读、不可重复读、幻读问题,一致性最差;一致性:彻底解决脏读、不可重复读、幻读,一致性最强;
2025-09-05 14:35:52
516
原创 MySQL事务的四大特性(ACID)
数据库允许多个事务并发执行,隔离性确保事务之间互不干扰,各事务仿佛独立执行。事务执行前后,数据库必须始终保持数据的一致性状态,满足所有预定义的完整性约束(如主键、外键、业务规则等)。事务是最小的执行单位,其包含的所有操作要么全部成功提交,要么全部失败回滚,保证事务不可分割。该特性通过 undo log(回滚日志)实现,日志记录了事务操作前的数据状态,用于在回滚时恢复原始数据。该特性依赖 redo log(重做日志)实现,redo log 记录已提交事务的修改操作,系统恢复时可通过重做日志恢复数据。
2025-09-04 22:51:15
404
原创 MySQL索引分类
按 数据结构 分类:B+Tree索引、Hash索引、Full-text索引、R-Tree索引。索引(Index)是数据库中帮助快速查找数据的数据结构,本质上是一种有序的数据组织方式。按 字段特性 分类:主键索引、唯一索引、普通索引、前缀索引。按 物理存储 分类:聚簇索引、二级索引。按 字段个数 分类:单列索引、联合索引。
2025-09-03 19:53:50
227
原创 MySQL存储引擎
MySQL存储引擎是管理数据存储的核心模块,主要包括:InnoDB(默认引擎,支持事务、行锁和高并发)、MyISAM(读性能优但不支持事务)和Memory(内存存储、速度快但不持久)。不同引擎适用于不同业务场景,需根据读写需求和数据安全性要求选择。
2025-09-03 19:53:01
171
原创 Java集合遍历的方法有哪些
支持安全删除(iterator.remove()),是遍历 Collection 的标准方式。适合做链式处理,可以配合 filter、map、sorted 等进行过滤、转换、排序等操作。Iterator的子类,仅用于 List,可以正向/反向遍历,还能在遍历时修改、插入元素。最常见、简洁,底层其实是迭代器(Iterator)只适用于支持随机访问的集合。函数式写法,简洁优雅。
2025-09-02 15:40:11
295
原创 ThreadLocal
ThreadLocal是Java中实现线程隔离的机制,为每个线程创建变量副本,避免线程间竞争。主要作用包括线程隔离、降低耦合和提升性能。使用时需注意:1)内存泄漏风险(Key为弱引用,Value为强引用),建议用完调用remove()清理;2)线程池环境下可能造成数据污染,必须在finally块中remove()。典型应用场景包括线程独立计数器和线程上下文管理。其原理是通过Thread类内部的ThreadLocalMap存储线程私有数据,每个线程拥有独立副本。正确使用可提高并发性能,但需谨慎处理资源清理。
2025-09-01 23:04:42
795
原创 AQS(抽象队列同步器)
AQS是Java中实现同步器的基础框架,核心包括状态变量state、FIFO队列和模板方法。state表示同步状态,具体含义由子类决定;队列管理等待线程;子类通过重写tryAcquire/tryRelease方法实现独占/共享模式。ReentrantLock、Semaphore等同步工具都基于AQS实现,通过CAS操作保证线程安全,并利用LockSupport进行线程阻塞与唤醒。
2025-09-01 20:11:49
620
原创 不同线程间的通信方式
CyclicBarrier(int parties, Runnable barrierAction):构造函数,指定参与的线程数量和所有线程到达屏障点后要执行的操作。volatile可以保证不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,新值对其他线程来说立即可见。用来在两个线程之间交换数据,如果只有一个线程调用了 exchange(),它会一直阻塞,直到另一个线程也调用。一个同步辅助类,允许一个或多个线程等待其他线程完成操作,一次性的,倒计时归零后不可重置。
2025-08-31 14:13:00
851
原创 syncronized锁升级与锁优化
没有开启偏向锁时的状态,在JDK1.6之后偏向锁的默认开启的,但是有一个偏向延迟,默认启动后 4 秒才开启偏向锁,可以通过JVM参数进行设置,是否开启偏向锁也可以通过JVM参数设置。当获取锁失败时,线程不会立即阻塞,而是自旋尝试获取锁,避免线程挂起/恢复带来的用户态 ↔ 内核态切换开销,提高性能,同时JVM 会根据前一次锁的持有时间动态调整自旋次数,减少无效自旋。JVM 编译器在分析后,如果发现同步块的对象没有共享或竞争的可能性,会去掉无用的锁,从而提高程序性能,如访问线程私有变量的同步块。
2025-08-30 11:23:27
289
原创 Java中有哪些锁
乐观锁:对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑,Java中主要采用CAS实现。多个线程获取锁的顺序并不是按申请锁的顺序,有可能后申请的线程先获取锁,可能会造成优先级反转和饥饿现象,优点是吞吐量更高、性能更好,Java 的ReentrantLock默认是非公平锁。当一个线程持有锁时,如果再次尝试获取该锁,就会成功获取而不会被阻塞。
2025-08-30 11:23:20
732
原创 Java线程死锁
摘要: 死锁是指多个线程因竞争资源而相互等待,导致程序无法继续执行。其必要条件包括:互斥、请求并保持、不可剥夺和循环等待。解决方法包括:一次性获取资源(破坏请求并保持)、主动释放资源(破坏不可剥夺)、按顺序申请资源(破坏循环等待),以及通过无锁算法减少互斥。针对不同条件采取相应措施可有效避免死锁。
2025-08-28 20:22:30
241
原创 线程池介绍
拒绝策略,当一个新任务提交给线程池,如果此时线程池中有空闲的线程,就会直接执行,如果没有空闲的线程,就会将该任务加入到阻塞队列中,如果阻塞队列满了,就会创建一个新线程,执行当前任务。固定大小线程池,核心线程数 == 最大线程数,固定线程数的线程池,阻塞队列为LinkedBlockingQueue(无界队列),它的特点是线程池中的线程数除了初始阶段需要从 0 开始增加外,之后的线程数量就是固定的,适用于服务器后台任务处理,任务量稳定。实现 RejectedExecutionHandler 接口。
2025-08-28 14:00:34
792
原创 线程进程基础
本文系统介绍了Java线程的核心知识:1.线程与进程的区别:进程是资源分配单位,线程是调度单位,线程共享进程资源但拥有独立栈空间;2.线程生命周期详解:包括新建、就绪、运行、阻塞、等待、超时等待和终止7种状态及其转换条件;3.run()与start()的区别:run()是普通方法调用,start()会创建新线程;4.四种线程创建方式:继承Thread类、实现Runnable/Callable接口以及使用线程池,分析各自的优缺点和使用场景。全文提供了完整的代码示例,特别强调了线程池在企业级应用中的优势。
2025-08-28 11:51:22
544
原创 垃圾回收算法与垃圾回收器
G1 收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾最多的区域。Java堆并行收集器,JDK1.7提供的一个新收集器,基于标记整理算法实现,不产生内存碎片,可以非常精确控制停顿时间,在不牺牲吞吐量的前提下,实现低停顿垃圾回收。将可用内存分为大小相等的两块,每次使用只使用其中的一块,当这一块内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用的内存清理掉。
2025-08-24 22:43:12
940
原创 Java的四种引用类型
只要通过强引用链能从 GC Roots 可达,垃圾回收器(GC)就不会回收该对象;当对象变为不可达才可能被 GC 回收,因此是造成内存泄漏的主要原因之一。主要用于跟踪对象被垃圾回收的过程,用来在对象被 GC 回收后做一些清理操作(比如堆外内存释放)。内存足够时,不会被回收,内存不足时,会回收软引用指向的对象,用来避免内存溢出,回收后,只要发生 GC,就一定会回收弱引用对象,无论内存是否充足,回收后,对象几乎等同于没有引用,不能通过虚引用获取对象实例(因此软引用适合做非强制、可回收的缓存。
2025-08-23 11:14:24
178
原创 Java内存模型(JMM)
4.传递性规则:如果 A happens-before B,且 B happens-before C,那么 A happens-before C。3.volatile 变量规则:对一个 volatile 变量的写操作 happens-before 后续对该变量的读操作。1.程序顺序规则:在一个线程内,按照代码书写顺序,前面的操作 happens-before 后面的操作。6. 线程终止规则:子线程中的所有操作 happens-before 主线程发现子线程终止的操作。5.线程启动规则:主线程对线程对象的。
2025-08-22 14:06:57
916
原创 JVM 内存结构
当同时进行的线程数超过 CPU 核心数时,就需要通过时间片轮派进行分配 CPU,难免会进行线程切换,这时候就需要程序计数器来存储存储当前线程正在执行的字节码指令的地址(或下一条将执行的指令地址 ),用于线程切换时恢复执行位置。存储类元数据、运行时常量池、静态字段的元信息(指向的实际对象在堆上)JIT 编译后的代码缓存(部分实现会放在 Code Cache,而不是方法区),Java8 以前由永久代实现,Java8 及以后由元空间实现。永久代:使用 JVM 内存,大小固定,易发生 OOM,
2025-08-21 21:51:42
171
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅