一、ReentrantReadWriteLock 核心概念ReentrantReadWriteLock 是 Java 并发包中用于解决读写者问题的同步工具,基于「读写分离锁」设计,包含两把锁:
读锁(SharedLock):允许多个线程同时获取,适合读操作(共享资源)。
写锁(ExclusiveLock):仅允许一个线程获取,适合写操作(独占资源)。
其核心特性是读写互斥、写写互斥、读读共享,完美满足读写者问题的 3 个基本要求。
二、锁的获取条件
获取读锁的前提:
没有线程持有写锁;
若有写请求,仅当当前线程是持有写锁的线程时(可重入)才能获取读锁。
获取写锁的前提:
没有线程持有读锁;
没有线程持有写锁;
当前线程可重入(已持有写锁时可再次获取)。
三、公平性策略ReentrantReadWriteLock 支持两种模式(通过构造函数指定):
非公平模式(默认):读操作可能优先于写操作(读者可能持续抢占,导致写者饥饿)。
公平模式:按线程请求顺序获取锁(实现「弱写者优先 / 公平竞争」,避免饥饿)。
四、核心方法
方法
说明
readLoc ...
IOC 容器是 Spring 框架的核心,其启动过程本质是资源加载、Bean 定义解析、容器初始化、Bean 实例化与依赖注入的完整流程。以 Spring 的AbstractApplicationContext为核心实现类,梳理启动核心十二步,结合关键源码深入理解。
一、容器启动十二步核心流程第一步:初始化 ApplicationContext 容器实例
核心作用:创建 IOC 容器的基础实例,指定配置源(如 XML 文件、注解配置类),初始化容器的基本属性(如资源加载器、环境变量)。
关键源码:
12345678// 以ClassPathXmlApplicationContext为例public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent); setConfigLocations(configLocations); // 设置配置文 ...
Lock 与 synchronized 的核心区别1. 功能覆盖与扩展
**Lock**:
几乎能实现 synchronized 的所有基础功能(保证线程安全、同步代码块),且具备 synchronized 不支持的高级特性:
锁投票(如通过 tryLock() 实现多线程竞争时的灵活选择);
定时锁等候(tryLock(long time, TimeUnit unit) 避免无限阻塞);
可中断锁(lockInterruptibly() 允许中断等待锁的线程);
支持公平 / 非公平锁选择、多条件变量(Condition)等。
**synchronized**:
功能相对基础,仅支持最基本的同步需求,不具备上述高级特性:
无法通过投票获取锁,一旦开始等待则必须等到锁释放;
不能中断等待锁的线程;
锁的释放只能在获取锁的同一堆栈帧中完成(自动释放,无法手动控制时机)。
2. 实现层面与释放机制
**Lock**:
是 JDK 5 引入的 API 层面的锁(位于 java.util.concurrent.locks 包),属于代码级别的实现;
必须手动释 ...
一、常用功能及示例1. 请求映射与方法限定
@RequestMapping 多属性配置
作用:灵活限定请求的方法、参数、头、内容类型等。
示例(限定请求方法、参数、请求头):
1234@RequestMapping(value = "/test02", params = {"age=18", "username", "gender!=1"})public String test02() { return "test02";}
示例(限定请求头):1234@RequestMapping(value = "/test03", headers = {"haha"})public String test03() { return "test03";}
示例(限定消费 / 响应内容类型):
12345678@RequestMa ...
实验
内容
目标
实验1
使用普通变量,收集请求参数
测试普通value封装
实验2
使用@RequestParam,逐一封装多个参数
测试@RequestParam与required
实验3
使用POJO,统一封装多个参数
测试bean封装
实验4
使用@RequestHeader获取请求头数据
测试@RequestHeader
实验5
使用@CookieValue获取Cookie数据
测试@CookieValue
实验6
使用POJO,级联封装复杂对象
测试级联封装
实验7
使用@RequestBody,封装JSON对象
测试JSON封装
实验8
使用@RequestPart/@RequestParam,封装文件对象
测试文件上传
实验9
使用HttpEntity,封装请求原始数据
测试HttpEntity
实验10
使用原生Servlet API,获取原生请求对象
测试Servlet API
一、常用类型
类型
作用
典型场景示例
@ResponseBody + 对象
响应 JSON 等非页面数据
接口返回用户信息、列表数据
ResponseEntity<B>
完全自定义响应头、响应体数据
文件下载(自定义 Content-Disposition 等头)
String
返回逻辑视图地址(用于页面渲染)
跳转到 Thymeleaf 模板页面
Map/Model
传递默认视图地址与数据(页面渲染用)
向页面共享用户列表、用户名等数据
ModelAndView
自定义模型和视图
同时指定页面模板和共享数据
二、不常用类型
类型
作用
适用场景
HttpEntity<B>
自定义响应头、响应体数据
类似 ResponseEntity,但灵活性稍弱
HttpHeaders
仅返回响应头,无内容
需单独设置响应头的场景
ErrorResponse/ProblemDetail
响应错误头、错误体
标准化的 API 错误返回
View
视图对象
自定义视图渲染逻辑
@ModelAttribu ...
一、基础配置
命名空间声明:在 HTML 根标签中添加 Thymeleaf 命名空间,启用语法支持:
1<html lang="en" xmlns:th="http://www.thymeleaf.org">
二、核心语法分类及示例1. 动态属性渲染(th:xxx)通过 th:属性名 动态设置 HTML 标签的属性值或执行指令,支持所有 HTML 属性及 Thymeleaf 自定义指令。
语法
作用
示例
th:text
动态渲染标签体内的文本
<span th:text="${username}"></span>(显示 Model 中的 username)
th:属性名
动态设置标签的指定属性(如 id、src)
<span th:id="${username}"></span>(用 username 作为 id 属性值)
th:attr
动态设置任意属性(适用于自定义属性)
< ...
一、作用在 Spring MVC(结合 Thymeleaf 模板引擎的服务端渲染场景中),Model 是用于向页面模板共享数据的核心对象,它能将后端的业务数据传递到前端页面,供 Thymeleaf 语法读取并渲染。
二、使用场景当需要在服务端渲染页面时(如登录成功后展示用户列表、个人信息等),通过 Model 把数据从控制器(Controller)传递到页面模板(如 Thymeleaf 的 .html 文件)。
三、使用方式在控制器方法中,通过方法参数注入 Model 对象,再调用其 addAttribute() 方法添加数据:
1234567891011@RequestMapping("/login.do")public String login(String username, String password, Model model) { // 模拟用户列表数据 List<User> userList = Arrays.asList(...); // 向 Model 中添加数据,key 为 "users&quo ...
文件下载核心知识点笔记一、核心问题与解决方向
中文文件名乱码:需对文件名进行 URL 编码。
大文件内存溢出(OOM):采用分块读取(InputStreamResource 包装流)。
资源泄漏:使用 try-with-resources 自动关闭 IO 资源。
响应头配置:通过 Content-Disposition、ContentType、ContentLength 控制下载行为。
二、关键技术点1. 中文文件名编码使用 URLEncoder.encode(filename, "UTF-8") 对中文文件名编码,避免浏览器下载时乱码。
2. 分块读取(防止 OOM)通过 InputStreamResource 包装文件输入流,由框架自动处理分块传输,避免大文件一次性加载到内存。
3. 响应头配置
响应头 / 属性
作用
示例值
Content-Disposition
控制文件下载行为,attachment 表示作为附件下载,需指定文件名。
attachment; filename=美女.jpg
ContentType
指定响应内容的媒体 ...



