- 博客(14)
- 收藏
- 关注
原创 深入理解JVM:从内存结构到垃圾收集器与算法
引言:将JVM比作一个高效的“工厂”。是车间和仓库(生产车间、原料库、成品库),是保洁和物流团队(负责清理废料、整理仓库腾出空间),是保洁团队的工作方法(比如是挨个车间打扫还是同时打扫),而就是不同的保洁团队(每个团队擅长的工作方法不同)。
2025-09-17 15:14:53
495
原创 深入源码:解读 HashMap 的线程陷阱与 ConcurrentHashMap 的并发艺术
从HashMap的“死链”、“数据覆盖”陷阱,到ConcurrentHashMap从“分段锁”到“CAS+synchronized”的精妙设计,我们看到了Java并发开发者们在追求性能与安全平衡点上的不懈努力。ConcurrentHashMap通过降低锁的粒度来提升并发性能,其设计经历了从“分段锁”到“CAS + synchronized”的现代化演进。(一种分片计数机制),并发更新时不同线程操作不同的Cell,最后求和,避免了激烈的CAS竞争,是。结合CAS无锁算法,实现了更低的开销和更高的性能。
2025-09-17 14:55:21
712
原创 源码溯源:Spring Boot如何实现“开箱即用”?自动配置的启动加载机制全解析
这完美体现了“约定大于配置”:你只需提供必要的参数(如url),Spring Boot就会按最约定的方式(使用HikariCP)为你完成配置。它就像一个 iceberg,用户看到的是简单的注解,但其下有复杂而精妙的机制在支撑。: “开箱即用”是Spring Boot最引以为傲的特性,只需寥寥几个依赖和配置,一个功能完备的Web应用即可启动。上图展示了自动配置的核心流程,接下来我们深入每一层源码,看看这一切是如何发生的。注解的运作机制,最终理解这套“约定大于配置”的魔法是如何实现的。
2025-08-25 16:17:10
848
原创 Spring IoC容器的“造物”之旅:Bean 的生命周期全览
本文将化身一场探索之旅,深入Spring IoC容器的核心,全景式地解析一个Bean从“胚胎”(BeanDefinition)到“诞生”(实例化)、 “成长”(属性填充、初始化)、直至“消亡”(销毁)的完整生命周期。会在此检查Bean是否需要被切面增强,如果需要,则会返回一个代理对象来代替原始对象。此时对象刚刚被创建,属性均为默认值(null, 0等),就像一个刚出生的婴儿。),容器会回调相关方法,让Bean感知到自身在容器中的身份和信息。容器中所有的Bean在初始化前后都会经过它的处理。
2025-08-25 09:41:14
560
原创 99%的人不知道:Spring Mapper接口根本不是“接口“!
在Spring的世界里,你看到的接口,可能早就不是你以为的那个接口了!Spring偷偷替换了它的Class对象,生成了一个。代码简洁度提升300%(无需手动写DAO实现)❓ 为什么一个没有实现类的接口能执行SQL?❓ 方法返回值如何自动转换为Java对象?:接口定义与SQL实现分离(注解/XML)性能损失降低到纳秒级(代理调用开销极小):动态代理层可以插入缓存、监控等逻辑。扩展性极大增强(可插拔拦截逻辑)事务AOP和Mapper代理是。并实现了你的Mapper接口。尝试在Mapper接口上加。
2025-08-19 09:47:18
375
原创 Java线程池状态终极指南:位运算设计&&面试考点&&全流程图解
------------------------>| (设置SHUTDOWN状态)|------------------------>| (检查TIDYING条件)实践中如需'重启'线程池,正确做法是创建新实例而非重置状态,这能保证资源管理的纯粹性。理解了状态的重要性后,我们接下来揭秘线程池如何用3个比特位高效管理状态与线程数。|------------------------>| (中断空闲线程)线程池需要在不同状态下合理管理线程资源,避免无限制创建线程导致OOM(如。
2025-08-18 16:23:14
965
原创 从源码到实战:彻底拆解Java线程池的设计哲学
线程池的定义与作用:线程池(Thread Pool)是一种多线程处理形式,它预先创建一组可重用的工作线程,用于执行提交的任务。线程池维护一个线程队列,当有任务到来时,从池中分配一个空闲线程来执行任务,任务完成后线程返回池中等待下一个任务,而不是被销毁。为什么使用线程池而非直接创建线程降低资源消耗:通过重复利用已创建的线程,减少线程创建和销毁带来的性能开销(线程创建涉及操作系统层面的资源分配,开销较大)提高响应速度:当任务到达时,可以直接使用现有的空闲线程执行任务,无需等待线程创建过程。
2025-08-17 23:31:50
738
原创 Java并发编程的灵魂:深入理解并掌握CAS(Compare-And-Swap)
在谈CAS之前,先来聊一下两种锁机制吧,即悲观锁和乐观锁。悲观锁:是一种悲观的并发控制思想,对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有其他线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被其他线程修改。所以悲观锁有强烈的排他性和独占性。乐观锁:乐观锁认为自己在使用数据时不会有其他线程修改数据,所以不会加锁,只是在更改数据的时候去判断之前是否有其他线程修改过数据。Compare-And-Swap (比较并交换) 是一种原子操作指令。是硬件级原子指令,是乐观锁的核心实现。
2025-08-17 14:34:03
1092
原创 Java小知识四之Integer的缓存池
可以通过修改java.lang.Integer.IntegerCache属性来改变缓存池的上限,System.setProperty("java.lang.Integer.IntegerCache",所期望的上限值)。是Integer类的一个静态方法,对于参数 i 要先进行判断,如果 i 在缓存池的范围区间内,则直接从缓存之中取出并返回。Interger.valueOf()方法是获取Integer对象的常用方法,对于存在于缓存池的数据会优先从缓存池中取出,而不是每次都创建一个新的对象。
2025-02-24 22:22:42
261
原创 Java小知识三之StringBuilder类的数据结构和扩容方式解读
首先,第一种是参数类型为int的,最终也会调用AbstractStringBuilder的有参构造,参数为当前参数的值。在图6中我展示了扩容问题中的几乎所有代码,总的来说就是,当进行字符串的修改时,要先进行容量是否足够的判断,如果容量足够则直接完成拼接。由图3和图4可知,当我们选择用StringBuilder的无参构造来创建对象时,最终会调用AbstractStringBuilder的。也印证了我所说的内部的字符数组的长度并不等于当前字符串的长度。的数组,所以说StringBuilder是一种可变字符串。
2025-01-21 10:52:38
958
原创 Java小知识二之String类的equals()方法用法及详细解读
从这里我们可以看出来,在Object类中定义的equals()方法就是用==运算符对两个对象进行比较的。多以并不是所有的equals()方法都是对内容进行比较的。然后对两个字符串的长度进行了比较,长度都不一样,内容肯定有所差别。其实,并不是只有String类有equals()方法,其他很多类和对象都有equals()方法。,但是在Object类中定义的equals()方法与==运算符是。是否一样,而接下来我们来看看equals()的源码。,但是==运算符与equals()是有区别的,
2025-01-20 10:55:02
1031
原创 Java小知识一之不可变的String
仔细检查一下String类的源码不难发现,其中定义的对字符串的修改方法并没有在原字符串上进行修改,而是选择重新用new关键字创建出来一个新的字符串对象。包括但不限于常用的substring、concat、replace、replaceAll、format等。因为Java中的String是用字符数组实现的,而在String类的底层代码中字符数组是这样声明的:privatefinalcharvalue[]如图1;如下图2所示先用final关键字声明一个字符数组常量然后试图给他重新分配地址。
2025-01-19 20:08:12
364
原创 JS通过两个计时器做出的平移动画
1.计算平移前后的竖直和水平像素差 Difference:number(平移后-平移前)2.设置元素的top和left属性top:平移前的top值+Difference = 平移后的top值left:平移前的left值+Difference = 平移后的left值3.通过对变化值的缩放和定时器实现平移动画 1.首先定义一个缩放的比例值(初始值设为0)2.设置定时器并将其赋值给一个变量(赋值给一个变量是为了后面可以清除该定时器) 因为定时器后一个参数为时间单位是毫秒,所以这里的定时器作用就是每10毫秒对缩放变
2024-11-09 00:43:13
753
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅