自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 【pmhub-base-core模块,XssFilter与XssHttpServletRequestWrapper】

本文介绍了Java Web应用中防范XSS攻击的两个核心类:XssFilter和XssHttpServletRequestWrapper。XssFilter作为过滤器入口,通过配置排除项决定哪些请求需要过滤;XssHttpServletRequestWrapper采用装饰器模式,重写请求处理方法对输入数据进行XSS清理。主要实现机制包括:1) 通过excludes列表配置白名单URL;2) 默认跳过GET/DELETE请求;3) 使用EscapeUtil对请求参数、头信息和输入流进行HTML转义处理。这两个

2025-11-27 20:51:51 1013

原创 【pmhub-base-core模块,@Xss与XssValidator】

本文介绍了两种互补的XSS防御策略:全局过滤器和精准校验注解。重点分析了基于JSR-303规范实现的@Xss自定义校验方案,包含注解定义和校验逻辑实现。@Xss注解可标记需校验字段,其校验器通过正则表达式检测HTML标签。使用时只需在DTO字段添加注解,配合Spring校验机制即可实现业务层精准防御。与全局过滤器相比,这种方案更灵活可控,适用于需要严格限制HTML输入的场景。

2025-11-27 20:47:22 391

原创 【ReentrantLock.ConditionObject#await() 与 ReentrantLock.ConditionObject#signal() 执行链路源码解析】

Condition 的队列是独立于 AQS 同步队列的await()把线程放到 condition 链上并释放锁;只有signal()才把线程从 condition 链“转移”到 AQS 同步队列。转移路径await()→→→park()(等待);signal()→→enq(node)(同步队列尾插)→(可能)→ 等待者在同步队列上恢复锁状态后继续执行。中断/取消:在 condition 等待期间发生的中断会触发特殊处理(),保证语义一致并且链表不被污染。为什么设计成两级队列。

2025-11-02 13:19:46 843

原创 【公平可重入锁 ReentrantLock#lock() 与 unlock() 的执行链路源码解析】

维度非公平(NonfairSync)公平(FairSync)lock()的实现先尝试(快抢),失败再acquire(1)直接acquire(1)(不先快抢)tryAcquire中是否检查队列不检查(或非公平实现的tryAcquire在快速路径里不调用使用来判断是否有前驱,若有前驱则不抢占插队可能性允许插队(后来线程可能成功 CAS 抢到锁,即使有人在队列中)不允许插队(尊重先到先得)性能开销更高吞吐,低延迟(尤其在低争用下)延迟更大,吞吐可能更低(因过多的队列检查与更严格调度)适用场景。

2025-11-02 12:08:44 942

原创 【非公平可重入锁 RentrantLock#lock() 与 unlock() 的执行链路源码解析】

state含义:在 ReentrantLock 中表示当前持有锁的重入计数,arg通常是1。快速路径 vs 慢路径:非公平锁优先用 CAS 快速获得锁;若失败则入队(可能又有快速 tail 插入)。队列保证公平性只有在时才调用tryAcquire,从而保证队列 FIFO 的“唤醒顺序”。park/unpark 协议:通过waitStatus的SIGNAL标志和的状态转换,防止“挂起后无人唤醒”或“唤醒丢失”的 race。中断处理:不可中断的acquire。

2025-11-01 21:45:27 635

原创 【Tomcat线程池 vs JDK原生线程池】

✅若任务数 < 核心线程数 → 创建线程;若任务数 ≥ 核心线程数 → 入队;若队列满 → 创建救急线程;若线程数 ≥ 最大线程数 → 拒绝任务。✅若任务数 < 核心线程数 → 创建线程;若任务数 ≥ 核心线程数 且 < 最大线程数 → 创建救急线程;若任务数 ≥ 最大线程数 → 入队;若队列满 → 拒绝任务。

2025-10-28 21:58:22 408

原创 【线程池正确处理异常的三种方式】

🧩线程池异常不外抛,try…catch要记牢;Callable + Future能回报,Handler兜底最可靠。

2025-10-28 21:02:22 415

原创 【原子累加器LongAdder#longAccumulate()源码解析】

(1)快速路径 base CAS;(2)条带 cells 的定位与 lazy 初始化;(3)当局部 CAS 失败时采取的自适应策略(扰动 probe / 扩容 / 退回)。

2025-10-26 16:27:47 667

原创 【原子累加器LongAdder#add(long)源码解析】

1. 尝试用 CAS 修改 base(乐观、快路径)2. 如果失败(竞争出现):2.1 若 cells 已存在,则根据线程哈希选取 cell 并 CAS 更新2.2 若 cell 不存在或 CAS 仍失败,调用 longAccumulate() 自适应扩容/重试。

2025-10-26 15:49:39 466

原创 【CPU缓存行伪共享--缓存一致性问题】

概念类比解释缓存行像快递箱子,每次搬一整箱(64字节)伪共享不同人放自己的物品在同一个箱子里,你改一件,别人整箱都得重拿缓存一致性保证各个箱子里的内容是最新的,一旦有人修改,就要通知其他人废弃旧箱@Contended / 填充给每个人单独一个箱子,互不影响,搬运快得多。

2025-10-26 14:48:42 621

原创 【线程安全的单例实现方式三:synchronized的懒汉式、双重检查+volatile的懒汉式、静态内部类的懒汉式】

你现在的实现是懒加载但不是线程安全。它在多线程下会发生重复创建和“半初始化对象”问题。推荐改成静态内部类、DCL+volatile,或更稳妥地使用枚举或饿汉式(视乎是否需要延迟初始化)。

2025-10-23 22:10:29 785

原创 【线程安全的单例实现方式二:枚举单例】

问题答案概要关键原理1️⃣ 限制实例个数由枚举常量个数决定,JVM 自动创建JVM & Enum 机制2️⃣ 是否线程安全是,类初始化阶段由 JVM 同步保证class init 锁3️⃣ 是否能被反射破坏否,JVM 禁止反射创建 enum 实例4️⃣ 是否能被反序列化破坏否,反序列化根据名字返回现有实例5️⃣ 属于哪种单例介于懒汉与饿汉之间:类加载时创建延迟加载的饿汉式6️⃣ 如何初始化逻辑在枚举构造器中执行即可构造器线程安全执行一次。

2025-10-23 21:45:51 1011

原创 【线程安全的单例实现方式一:饿汉式】

final好 —— 我来把这段“饿汉式单例”逐条拆开解释,并把你注释里的问题一条条回答清楚,同时补充容易忽视的攻击面(序列化 / 反射 / 克隆 / 类加载器)以及几个可选的改进方案和理由。下面逐条回答并解释关键点。

2025-10-23 21:24:56 948

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除