自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(118)
  • 资源 (2)
  • 收藏
  • 关注

原创 Camunda修改列表

Update preview automatically : 开启。然后再Table 后面的小齿轮修改列表。

2026-10-06 22:18:23 32

原创 【AI】RRF(倒数排名融合)说明

RRF(倒数排名融合)是一种高效混合搜索算法,通过融合关键词与向量检索结果,提升排序质量。其核心思想是:文档在多个列表中排名越靠前,最终得分越高。公式为 $ \frac{1}{k + \text{rank}} $,其中 $ k=60 $ 为默认平滑常数,避免分数差异过大。支持加权融合(如 $ w=3 $ 表示关键词检索更关键),权重只需保持比例即可。计算后按总分重排,结果鲁棒且无需归一化。常用于生产环境,后续可结合交叉编码器进行精排,显著提升搜索精度。

2026-09-15 14:13:12 294

原创 【AI】Qwen3-Reranker-0.6B 下载

Qwen3-Reranker-0.6B 的官方源主要有两个:Hugging Face 和 魔搭社区(ModelScope)。如果你在国内网络环境下,强烈建议优先使用魔搭社区,下载速度和稳定性会好很多。魔搭社区 ModelScope (国内推荐):https://www.modelscope.cn/models/Qwen/Qwen3-Reranker-0.6B。Hugging Face (官方源):https://huggingface.co/Qwen/Qwen3-Reranker-0.6B。

2026-09-15 13:44:29 233

原创 23 种设计模式(GoF)代码示例说明

本项目实现了GoF 23种设计模式的Java示例代码,包含创建型(5种)、结构型(7种)和行为型(11种)三大类模式。每个模式都有独立可运行的Demo类,通过main方法即可测试,代码包含详细注释。创建型模式关注对象创建方式,如单例、工厂等;结构型模式处理类/对象组合,如适配器、代理等;行为型模式解决对象交互问题,如观察者、策略等。项目提供了模式速查表和典型应用场景说明,适合设计模式学习和参考使用。

2026-08-05 16:46:35 175

原创 【mysql】MySQL 数据库 30 道高频面试题(含答案)

这套题覆盖了从基础到架构的核心考点,建议重点背诵部分。

2026-08-04 16:47:33 596

原创 mysql数据库动态连接池配置实战方案

的。这套方案专门针对场景,重点解决。

2026-08-04 16:34:10 136

原创 【Mysql】「主从延迟 + 连接池雪崩」的真实事故复盘

结合之前配置的三数据源 + HikariCP +@DS的技术栈,还原事故的根因、传导链、止损过程、长期治理方案完整。📌 事故原型:某电商订单服务,主从延迟触发从库读不到刚写入的数据 → 业务层重试 → 从库压力激增 → 主库也被拖垮 → HikariCP 连接池在 15 秒内雪崩。

2026-08-04 16:14:43 315

原创 【Mysql】动态数据源Dynamic DataSource 的连接流转全过程

摘要(149字): Dynamic DataSource 通过 ThreadLocal 实现多数据源动态路由,核心流程分为:1)@DS("master")写入主库时,AOP 切面标记数据源,事务拦截器绑定连接;2)@DS("slave")读从库无事务,每次独立获取连接;3)@DS("report")隔离查询报表库。关键设计包括线程隔离、方法结束清理ThreadLocal、事务内不可切换数据源。跨库事务需拆分独立事务或使用@DSTransactional。附PlantUML时序图源码支持二次编辑。

2026-08-04 15:39:36 159

原创 【mysql】线上实战:InnoDB 核心参数配置模板

(目前互联网公司的主流选型)。

2026-08-04 15:20:41 185

原创 【JVM】JVM 类加载机制详解

摘要: JVM类加载机制分为加载、验证、准备、解析、初始化5个阶段。加载阶段读取字节码并生成Class对象;验证阶段确保字节码安全合法;准备阶段为静态变量分配内存并赋零值(final常量直接赋值);解析阶段将符号引用转为直接引用;初始化阶段执行<clinit>()方法完成静态代码块和变量赋值。关键点:双亲委派机制保障安全与唯一性,通过<clinit>与<init>区分类与实例初始化,类卸载需满足实例、ClassLoader、反射引用均被回收。高频面试问题涵盖阶段差异、双亲委派原理及打破场景。

2026-08-04 09:47:01 274

原创 【缓存】本地缓存Caffeine AsyncCache实现原理与最佳实践

CaffeineAsyncCache通过实现了 JVM 级的 SingleFlight。在 Java 8 中,底层依赖 CAS 无锁 +桶级锁的混合策略,以极低的锁开销保证同一 Key 只加载一次。

2026-08-03 13:54:04 305

原创 【多线程:12】实战SpringBoot项目多线程排查与监控方案

摘要 本文档提供了一套Spring Boot生产环境多线程问题的全链路解决方案,涵盖预防、监控、定位和兜底措施。主要内容包括: 常见问题清单:列举线程池耗尽、死锁、内存泄漏等5类典型多线程问题及其危害等级。 监控体系建设: 使用Spring Boot Actuator+Micrometer+Prometheus+Grafana构建监控体系 提供自定义线程池监控指标的实现代码(活跃线程数、队列长度等) 配置Grafana监控大盘和告警规则 实战排查手册:针对线程池耗尽、死锁、CPU飙高等场景提供具体排查步骤。

2026-08-03 10:04:00 264

原创 【多线程:11】ThreadLocal 必须清理

摘要:ThreadLocalMap的扩容问题核心在于其动态哈希表机制,即使线程池固定为200个线程且仅使用20个字符串,仍会发生内存泄漏和性能问题。主要原因包括:1)哈希冲突导致线性探测,GC回收Key后Entry槽位仍占用但不释放,触发扩容;2)僵尸Entry累积导致数组膨胀,200线程可能占用数MB内存;3)未调用remove()会导致数据串扰,后续请求可能读取到脏数据。最佳实践是必须使用try-finally或AOP确保清理,避免业务逻辑错误和内存问题。

2026-08-03 10:01:46 189

原创 【多线程:10】线程池拒绝策略 DiscardPolicy 兜底代码方案

摘要 本文提出一个健壮的线程池任务丢弃策略(DiscardPolicy)兜底方案,适用于线程池或任务队列满时的异常处理。核心设计包含:1) 日志记录和丢弃计数功能;2) 可配置的告警阈值机制;3) 死信队列存储选项;4) 线程池状态监控。方案通过FallbackHandler接口实现可扩展的兜底逻辑,支持自定义处理策略。文中提供了Spring Boot集成示例和最佳实践建议,强调多层防护、监控告警、动态配置和恢复机制等关键设计要点。该方案能有效处理任务丢弃场景,保障系统稳定性。

2026-08-03 09:58:42 171

原创 【多线程9】CompletableFuture 的默认线程池 ForkJoinPool 深度解析

/ 1. 定义 IO 密集型线程池(大池)return t;},// 2. 定义 CPU 密集型线程池(小池,可用 ForkJoinPool)// 3. 根据任务类型选择池CompletableFuture.supplyAsync(() -> queryDB(), ioPool) // IO 任务用 IO 池.thenApplyAsync(data -> compute(data), cpuPool) // 计算任务用 CPU 池// 写日志用 IO 池。

2026-08-03 09:38:51 371

原创 【多线程:8】Future 与 CompletableFuture:原理、应用及区别

本文将深入解析Java异步编程中的Future机制。首先通过同步代码与异步改造的对比,展示异步编程提升性能的优势。随后重点剖析Future接口及其实现类FutureTask,包括其7种状态机的设计原理,以及核心方法get()的阻塞机制和cancel()的任务取消逻辑。文章还详细解读了FutureTask内部采用Treiber Stack结构存储等待线程的无锁实现,并通过代码示例演示了Future的基础用法。整体揭示了Future作为JDK5异步基石的设计思想与实现细节。

2026-08-02 11:25:44 254

原创 【多线程:6】ThreadPoolExecutor 原理解读与应用

核心线程 → 任务队列 → 非核心线程 → 拒绝策略,四步走,逐级降级。@Overridelog.warn("任务被拒绝: {}", r);if (!// 延迟重试▼│── 是 ──▶ addWorker(核心) ──▶ 直接执行│ 否▼│ workQueue.offer() 成功?│── 是 ──▶ 入队等待 ──▶ getTask() 获取│ 否(队列满)▼│── 是 ──▶ addWorker(非核心) ──▶ 执行│ 否(达到上限)▼💡关联知识链。

2026-08-02 11:20:31 291

原创 【多线程:7】多线程池的情况下,CPU密集型和IO密集型线程池配置

本文提供了线程池配置的实用指南,主要包含:1)根据CPU核心数(8核32-64线程,16核64-128线程)设置全局线程总数,并预留20%余量;2)区分CPU密集型(如加密计算、编解码等建议线程数=CPU核数)和IO密集型(如数据库操作、远程调用等建议线程数=CPU核数×1-2倍)任务的线程池配置;3)配套防护措施,包括使用有界队列(容量为核心线程数的2-4倍)、监控上下文切换(超过5000次/秒需调整)以及采用CallerRunsPolicy拒绝策略。

2026-08-02 11:13:16 224

原创 【多线程:5】线程池生命周期——优雅关闭模板

本文深入解析线程池的生命周期与优雅关闭策略,涵盖5种核心状态(RUNNING到TERMINATED)及其转换流程。通过对比shutdown()、shutdownNow()等方法差异,给出标准关闭模板代码,重点剖析InterruptedException处理中必须同时调用shutdownNow()和恢复中断标志的双重必要性。文章指出任务需主动响应中断,并提供常见踩坑案例,最后强调面试应答要点:异常处理时要保证资源释放和中断信号传递的完整性。附源码级状态机说明,帮助开发者实现线程池的安全终止。

2026-08-02 11:07:18 317

原创 【多线程:4】execute() vs submit() 面试速记卡片 + 对比脑图

本文通过对比execute()和submit()方法的区别,总结了它们在返回值、任务类型、异常处理等方面的差异。execute()直接抛出异常但无返回值,适用于简单异步任务;submit()返回Future对象,支持Runnable和Callable,异常被封装需通过get()获取。文章提供了代码示例展示异常处理方式,并分析了submit()吞异常的原理。最后给出最佳实践建议和避坑指南,帮助开发者正确使用这两种方法。核心口诀点明关键区别:execute简单直接,submit需配合get()处理异常和结果。

2026-08-02 10:56:02 152

原创 【多线程:3】Java线程池核心参数详解与线上调优指南

本文总结了线程池的7大核心参数及其作用,重点解析了任务提交流程和线上配置方案。针对IO密集型业务场景,提供了8核服务器的推荐配置:核心线程16、最大线程32、60秒存活时间、容量1000的有界队列,并采用CallerRunsPolicy拒绝策略。文章强调生产环境必须自定义线程命名、禁用无界队列,并给出了可直接使用的实战配置代码和监控方案。最后指出Executors工具类创建线程池的隐患,强调必须手动配置线程池参数。全文提供了线程池调优口诀,适用于面试和实际生产环境。

2026-08-01 10:43:11 281

原创 【多线程:2】Java中创建线程有哪几种方式与线程状态

本文介绍了Java中四种创建线程的方式:1)继承Thread类重写run()方法;2)实现Runnable接口;3)实现Callable接口配合FutureTask获取返回值;4)使用ExecutorService线程池。每种方式都提供了代码示例,并对比了它们的优缺点。继承Thread类最简单但不推荐;Runnable接口更灵活;Callable支持返回值;线程池是最推荐的资源管理方式。文章最后根据不同场景(简单任务、需要返回值、资源管理等)给出了选择建议,帮助开发者根据实际需求选择最合适的线程创建方式。

2026-08-01 10:12:14 207

原创 【多线程:1】Java 多线程完整知识结构图

│ │ │ volatile │ │ CAS + Atomic 系列 │ │ │。│ │ │ • 可见性 │ │ AtomicInteger / LongAdder │ │ │。│ │ │ • 修饰代码块 │ │ │ │ │。

2026-08-01 10:11:21 179

原创 【锁7】Java 并发编程实战:账户转账与死锁排查

本文介绍了转账操作中的死锁问题及其解决方案。首先展示了一个存在死锁隐患的转账服务类,通过两个线程反向转账可以稳定复现死锁。随后提出了两种解决方案:1)固定加锁顺序(推荐),通过按对象HashCode排序确保全局一致的锁获取顺序;2)使用ReentrantLock的tryLock方法实现超时机制,避免无限等待。两种方法都能有效解决转账场景中的死锁问题,其中固定顺序法更符合面向对象设计原则。

2026-08-01 10:10:45 201

原创 【锁5】ReadLock(读锁)原理与用途详解

ReadLock是ReentrantReadWriteLock中的读锁,专为读多写少场景设计。其核心价值在于允许多线程并发读取共享资源,同时防止数据脏读。通过AQS机制,它使用32位状态变量高16位记录读锁次数,低16位记录写锁次数,并配合ThreadLocalHoldCounter跟踪线程重入次数。相比独占锁,ReadLock显著提升系统吞吐量,支持锁降级(写锁转读锁),但不支持Condition。典型应用于缓存、配置加载等高并发读取场景。

2026-08-01 10:10:10 351

原创 【锁4】CountDownLatch vs CyclicBarrier

Java并发包中的CountDownLatch和CyclicBarrier都是线程同步工具,但设计目的不同。CountDownLatch用于一等多场景(主线程等待其他线程完成),基于AQS实现,计数器递减且不可重用;CyclicBarrier用于多等多场景(线程间相互等待),基于ReentrantLock实现,计数器可循环重置,支持多轮协作。前者适用于启动检查、资源加载等一次性任务,后者适合分阶段并行计算等需要多轮同步的场景。关键区别在于计数器机制、可重用性以及等待方的角色不同。

2026-07-31 15:21:19 310

原创 【锁3】Semaphore(信号量)

本文介绍了Java中信号量(Semaphore)的用法,通过许可证机制控制线程并发访问资源。核心要点包括:1)初始化时指定许可证数量N,限制并发线程数;2)使用acquire()获取许可证,release()释放;3)必须确保释放操作执行,否则会导致死锁;4)提供了tryAcquire()非阻塞版本用于限流。文中给出了Java实现示例,展示了5个线程在3个许可证下的运行情况,并对比了数据库连接池、API限流等典型应用场景。最后提醒注意事项:死锁风险、公平性设置及异步编程中的使用限制。

2026-07-31 15:00:47 125

原创 【锁6】AQS (AbstractQueuedSynchronizer) 核心原理详解

AQS(AbstractQueuedSynchronizer)是Java并发包的核心框架,通过volatile int state和CLH队列实现线程同步。它采用模板方法模式,将资源获取/释放的具体逻辑交由子类实现(如ReentrantLock、Semaphore等)。核心流程包括:获取资源时尝试CAS修改state,失败则进入CLH队列阻塞等待;释放资源时唤醒队列中的后继节点。AQS还通过ConditionObject支持条件等待机制,维护同步队列和条件队列的双队列结构,实现高效的线程间协作。

2026-07-31 12:02:17 331

原创 【锁2】锁的分类与概念

本文系统介绍了Java中的主要锁机制,包括悲观锁(synchronized、ReentrantLock)和乐观锁(CAS、版本号)的实现原理与代码示例。内容涵盖锁的分类对比(悲观/乐观、公平/非公平、可重入/不可重入等)、适用场景分析以及具体实现方式,帮助开发者深入理解并发编程中的锁机制选择与使用。通过数据库层面和Java代码层面的双重视角,展示了不同锁在实际开发中的应用场景和最佳实践。

2026-07-31 12:01:26 231

原创 【锁1】Synchronized vs ReentrantLock区别

本文对比分析了Java中Synchronized和ReentrantLock两种锁机制。Synchronized是JVM内置关键字,支持锁升级(偏向锁→轻量级锁→重量级锁),通过代码演示了不同并发场景下的锁状态变化。ReentrantLock基于AQS实现,提供更灵活的锁控制,核心机制包括volatile state状态和CLH队列,非公平锁会先尝试CAS抢锁再进入队列等待。两者各有特点:Synchronized使用简便但功能有限,ReentrantLock功能丰富但需要手动管理。

2026-07-31 10:11:39 356

原创 用 JDK 17 真实生成可被 MAT 打开的堆快照练习文件

摘要: 本文详细指导如何利用JDK 17生成真实可分析的堆快照文件(.hprof),并通过MAT工具进行内存泄漏分析。内容涵盖: 环境准备:确认JDK版本(17+)、下载匹配的MAT工具(如1.14.0)。 模拟泄漏程序:提供Java示例代码(LeakDemo.java),模拟三种典型内存泄漏场景(静态缓存无淘汰、ThreadLocal未清理、大对象持续分配)。 操作步骤: 编译运行程序(配置OOM自动生成堆快照参数)。 提供三种生成堆快照的方法(jmap、jcmd、OOM自动触发)。 使用MAT分析泄漏源

2026-07-28 13:02:37 354

原创 JVM OOM 排查与真实案例复盘

本文系统梳理了JVM内存溢出(OOM)的排查方法论,通过五步流程(紧急止损→日志分析→堆快照定位→在线诊断→修复预防)提供完整解决方案。重点分析了四种典型OOM场景(堆内存、元空间、线程数、堆外内存)的排查技巧,并配合MAT工具演示了支配树分析和GC Roots引用链追踪的核心方法。文中通过一个电商缓存泄漏案例,详细还原从故障发生到代码修复的全过程,包括如何利用GC日志、堆快照和Arthas工具定位问题,最终给出"事前配置自动dump+事中分级止损+事后监控预防"的最佳实践方案,附排查口诀和工具链推荐。

2026-07-28 08:33:33 418

原创 JVM 面试题 30 道(含参考答案)

📌 JVM核心知识点摘要 本文系统梳理JVM关键技术点: 内存区域:分为线程共享区(堆、方法区/元空间)和私有区(程序计数器、虚拟机栈、本地方法栈),堆采用分代设计(新生代+老年代)提升GC效率。 垃圾回收:基于可达性分析判断对象存活,分代采用不同算法(新生代复制算法、老年代标记-整理)。常见收集器如CMS(低延迟)、G1(可预测停顿)、ZGC(超低延迟)。 关键机制:程序计数器保证线程切换准确性,方法区JDK8后改为元空间避免OOM,引用类型(强/软/弱/虚)实现差异化对象管理。 性能调优:关注STW优

2026-07-28 08:27:48 342

原创 CMS 垃圾回收器配置详解

CMS(Concurrent Mark Sweep)已经在 JDK 9 中被标记为 Deprecate(废弃),并在 JDK 14 中被彻底移除。但在大量使用 JDK 8 的老牌公司(银行、电信、传统软件)中,CMS 依然在生产环境运行。

2026-07-27 18:59:09 203

原创 G1垃圾回收器配置详解

永远不要盲目修改参数!上线前:使用 GC 日志。使用工具分析日志:GCViewer​ (开源)GCeasy​ (在线,免费版够用)Prometheus + Grafana​ (配合 JMX Exporter 实时监控)关注指标:Throughput​ (吞吐量):99% 以上为佳。Latency​ (延迟):P99/P999 停顿时间是否符合预期。Old Gen Growth​ (老年代增长趋势):是否持续增长不释放(可能内存泄漏)。

2026-07-27 18:25:54 161

转载 JVM 内存结构详解

老年代存储的是存活时间较长的,也就好几轮没回收的,认为该对象活的时间较长,放在老年代就避免频繁判断是否回收。也可能当新生代内存不够了会直接将对象放在老年代中。众所周知,Java的特点是一次编译,到处运行,而这个到处运行的关键就是JVM虚拟机,项目跑在JVM虚拟机上,而虚拟机适配各种系统,如windows、linux、mac。安全,防止核心类被篡改 比如你自己写一个java.lang.String类, 因为启动类加载器已经加载过系统的 String,不会加载你写的,避免安全漏洞。父类加载不了,自己再加载。

2026-07-25 23:41:26 41

原创 时间工具类 DateUtil

【代码】时间工具类 DateUtil。

2023-09-14 22:41:09 252

原创 Java基本类型所占字节简述

boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示;但在虚拟机中,boolean类型占了单独使用是4个字节,在数组中又是1个字节;

2023-03-02 22:37:14 705

转载 var 与 let 的区别

因此,let 是在现代版本中的 JavaScript 创建的一个新的关键字,用于创建与 var 工作方式有些不同的变量,解决了过程中的问题。出于这些以及其他原因,我们建议您在代码中尽可能多地使用 let,而不是 var。我们现在不会讨论所有的差异,但是当您了解有关 JavaScript 的更多信息时,您将开始发现它们。

2022-11-01 20:55:39 347

原创 2021-05-25

代码优化如何平衡代码效率与代码整洁

2021-05-25 19:11:54 217

23 种设计模式(GoF)代码示例说明

23 种设计模式(GoF)代码示例说明

2026-08-05

java策略模式示例.zip

java策略模式示例代码,用于初学者学习使用,示例简单易懂

2019-09-26

springcloud注册中心Eureka集群示例代码.zip

springcloud注册中心Eureka集群代码示例,使用springcloud搭建Eureka集群,并通过订单服务调用会员服务,以及实现本地负载均衡效果

2020-03-14

空空如也

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

TA关注的人

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