Spring事务的七种传播行为为何让无数开发者踩坑:从REQUIRED到NESTED的设计哲学与实现原理
某电商系统在大促期间出现了一个诡异的问题:订单创建失败后,审计日志也没有记录。开发者明明在catch块里调用了审计服务的save方法,为什么数据还是消失了?排查日志后发现了这行异常: ...
某电商系统在大促期间出现了一个诡异的问题:订单创建失败后,审计日志也没有记录。开发者明明在catch块里调用了审计服务的save方法,为什么数据还是消失了?排查日志后发现了这行异常: ...
线程创建从来不是免费的。在Java中,每个线程都会分配一个独立的调用栈(默认1MB),线程的创建和销毁需要操作系统参与,涉及系统调用和内存分配。当线程数量达到数千时,这种开销会显著影响系统性能。正是这一根本问题催生了线程池的设计——通过线程复用减少创建销毁的开销。2004年,随着JSR 166的正式发布,Java 5引入了java.util.concurrent包,ThreadPoolExecutor成为这个包中最核心的组件之一。 ...
2003年,Doug Lea向JCP提交了JSR-166规范提案,试图为Java引入一套标准化的并发工具库。在此之前,Java开发者面对并发场景时只能在synchronized、Hashtable和Collections.synchronizedMap之间做出选择——它们要么过于粗粒度,要么性能堪忧。ConcurrentHashMap作为这套工具库的核心组件之一,其设计理念影响了此后二十年Java并发编程的范式。 ...
2004年,Doug Lea在POC CSJP Workshop上发表了一篇题为《The java.util.concurrent Synchronizer Framework》的论文。这篇论文的核心贡献是提出了一个统一的同步器框架——AbstractQueuedSynchronizer(AQS),它用一个int类型的state变量和一个FIFO队列,解决了Java并发编程中几乎所有同步原语的实现问题。 ...
2004年,Rod Johnson在《Expert One-on-One J2EE Development without EJB》一书中首次提出了Spring框架的核心设计理念。其中,依赖注入(Dependency Injection)作为实现控制反转(IoC)的主要手段,彻底改变了Java企业级开发的范式。然而,依赖注入的便利性也带来了一个棘手的问题:当两个或多个Bean相互依赖时,容器该如何处理? ...
2017年,某高频交易公司的Java系统在关键交易时段出现了一次3.2秒的停顿。这不是网络故障,也不是数据库锁死——仅仅是垃圾回收器在清理一个16GB的堆。在金融交易的世界里,3.2秒意味着数百万美元的损失。 ...