在并发程序中,只有当多个线程争抢同一个锁对象时,才能实现对临界资源(共享资源)的同步控制。如果锁对象不同,多个线程会各自持有不同的锁,无法相互限制,会导致并发安全问题(如数据不一致、重复操作等)。
核心逻辑:锁的 “互斥性” 依赖于 “同一把锁”
相同锁:多个线程会排队等待获取这把锁,同一时间只有一个线程能执行同步代码(实现 “互斥”),从而保证共享资源的安全。
不同锁:每个线程可以同时获取自己的锁,同步代码会被并发执行,无法保证共享资源的安全。
一、核心概念定义1. synchronized 关键字
本质:Java 提供的用于实现线程同步的核心关键字,是实现 “互斥” 和 “原子性” 的基础工具。
作用:保证多个线程对共享资源的访问是 “串行执行” 的,避免并发安全问题(如数据不一致、重复操作)。
适用场景:可作用于两个维度:
修饰方法:生成 “同步函数”;
修饰代码块:生成 “同步代码块”。
2. 同步函数
本质:被 synchronized 关键字修饰的方法,是 synchronized 的一种具体应用结果。
核心特性:
同步范围:默认同步整个方法体,线程进入方 ...
1234567891011121314151617static final int tableSizeFor(int cap){int n = cap-1;n|=n>>>1;n|=n>>>2;n|=n>>>4;n|=n>>>8;n|=n>>>16;return (n<0)?1:(n>=MAXMUM_CAPACITY ? MAXMUM_CAPACITY : n+1);}
它的作用就是把我们传入的初始容量值 变成离他最近的而且是2的整数次方的值17 –> 3216 –>1631 –>3233 –>64
帮助理解: 二进制 10000000010 对应的十进制是 1026,假设这就是 cap-1 的值(即 n = 1026),执行过程如下:
初始 n = 10000000010(二进制)
n |= n >>> 1 右移 1 位得到 01000000001,按位或后结果为 11000000011
n |= n ...
AOP通过对逻辑的切入,在方法执行前后 对方法进行 修饰,包装,以及利用,可以达到很多效果(自己理解)
举例模板化的业务逻辑(事务)
获取数据库连接
设置非自动提交
执行 SQL
==封装返回值==
正常:提交
异常:回滚
关闭链接
模板化的业务逻辑(权限)(假设使用 @Role (“admin”) 注解)
拿到用户身份
拿到目标方法标注的所有注解
==判定是否为注解指定的身份用户==
是:执行目标方法
不是:记录非法请求
(AI)AOP(面向切面编程)在项目中主要用于解决系统中具有横切性质的问题,通过将分散在各个业务逻辑中的共性功能抽取出来,实现代码复用和关注点分离。以下是 AOP 在项目中常见的应用场景:
日志记录
无需在每个方法中手动编写日志代码,通过 AOP 可以统一拦截方法的调用,自动记录方法的入参、出参、执行时间、调用者信息等,便于系统调试和运维监控。
权限验证
在接口调用前,通过 AOP 拦截请求,检查用户是否拥有访问权限(如登录状态、角色权限等),避免在每个接口中重复编写权限校 ...
记 BeanFactory 核心集合,记住这 5 个核心 “仓库”:
Bean 定义仓库:beanDefinitionMap(存蓝图)+ beanDefinitionNames(记顺序)
单例成品仓库:singletonObjects(存可用的单例 Bean)
单例半成品仓库:earlySingletonObjects(存未完成的单例,解决循环依赖)
单例工厂仓库:singletonFactories(生产半成品的工厂)
关系仓库:aliasMap(别名)+ 两个依赖 Map(记谁依赖谁)
一句话锚点:**”定义排好队,成品半成品分开存,工厂负责造半成品,关系网要记牢”**
单切面: 正常链路:前置通知 -> 目标方法执行 -> 返回通知 -> 后置通知 异常链路:前置通知 -> 目标方法执行 -> 异常通知 -> 后置通知多切面: 按照切面优先级,@Order(1) 指定优先级,数字越小优先级越高,越是代理最外层后置像finally一样一定执行
![[2025-10-10_19-34-37-0.png]]
JoinPoint连接点信息,/**
告诉Spring当前类是一个切面类
告诉Spring,以下通知方法,何时何地被调用
何时?
@Before 在目标方法之前运行
@After 在目标方法之后运行
@AfterReturning 运行在目标方法正常返回之后
@AfterThrowing 运行在目标方法抛出异常之后
@Around 以上的四合一,可以修改返回值
何地?
execution(public * com.atguigu.spring.aop..(..))*/
@Pointcut 是 Spring AOP 中用于定义切入点的注解,它 ...
1@Order(1) 注解 优先级
核心规则是:数字越小,优先级越高(即高优先级切面的通知先执行 “前置逻辑”,后执行 “后置逻辑”)。
![[Pasted image 20251003194032.png]]
切入点表达式语法@Pointcut 的值是切入点表达式,用于匹配目标方法。常用语法有:
1. execution():最常用,按方法签名匹配语法:execution(修饰符 返回值 包名.类名.方法名(参数) 异常)
通配符:
*:匹配任意字符(如任意返回值、任意方法名)
..:匹配任意层级的包或任意参数(如 com.example..* 表示 com.example 下所有子包)
示例:
12345678// 匹配 com.example.service 包下所有类的 public 方法@Pointcut("execution(public * com.example.service.*.*(..))")// 匹配 com.example.dao 包及子包下所有类的任意方法(返回值为 String)@Pointcut("execution(String com.example.dao..*.*(..))")// 匹配 UserService 类中参数为 (String ...
三级缓存【源码】
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748@Nullable protected Object getSingleton(String beanName, boolean allowEarlyReference) { // 1. 先从一级缓存(成品单例)中获取 Object singletonObject = this.singletonObjects.get(beanName); // 2. 如果一级缓存中没有,且当前Bean正在创建中 if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) { // 2.1 从二级缓存(早期单例)中获取 singletonObject = this.earlySingletonObjects.g ...
AnnotationUtils类ClassUtils类TypeUtils类ReflectionUtils类
在 Spring 框架中,AnnotationUtils、ClassUtils、TypeUtils 和 ReflectionUtils 都是工具类,主要用于简化 Java 反射、注解处理、类操作等底层逻辑。它们封装了大量繁琐的反射 API 和类型处理逻辑,是 Spring 内部实现的重要支撑,也常被开发者在业务代码中直接使用。
1. AnnotationUtils(注解工具类)作用:专门用于处理 Java 注解的工具类,提供注解查找、属性提取、注解继承等功能,解决了 Java 原生反射在处理注解时的诸多限制(如无法直接获取继承的注解)。
核心功能:
查找类、方法、字段上的注解(包括继承的注解)。
提取注解的属性值,支持默认值处理。
判断注解是否存在或匹配特定类型。
处理注解的组合(组合注解)和元注解。
常用方法:
12345678// 获取类上的注解(包括父类继承的)Annotation annotation = AnnotationUtils.findAnnotation( ...



