无标题
一段 i++ 代码引发的丢失更新,引出两条解决路线。本文先讲清问题的本质,再把悲观锁落到 synchronized 的对象头与 monitor,把乐观锁落到 CAS、版本号与 Atomic 原子类,最后讨论锁升级、自旋、阻塞排队与选型。
多线程为什么会读到旧值?从 CPU 缓存、JMM 到 volatile 的全链路拆解
一段 flag 标志位的代码,线程 B 明明看到 flag=true,却可能打印出 a=0。本文先分清并发问题的两类根源——缓存/重排与线程交错,再从 CPU 三级缓存、指令重排序讲到 JMM 的主内存/本地内存、八种操作与 happens-before,最后落到 volatile 的可见性、内存屏障和 DCL 半初始化问题。
RAG为什么答不出全局性和关联性问题? GraphRAG 与 LightRAG 全链路拆解
围绕传统 RAG 的三类失效——切片把逻辑关系切断、全局性问题检索不出来、多跳推理没有交集机制,拆解 GraphRAG 如何用「实体关系图 + 分层 Leiden 社区 + 社区报告」换来全局视角,以及 LightRAG 如何删掉社区、改用双层关键词检索,换来更低的成本、自然的增量与更低的延迟。最后给出两者的四个困点、各自的代价与一套可落地的选型路径。
RAG 为什么总答不准?从切块到混合检索的全链路拆解
围绕「RAG 为什么总答不准」这条线索,讲透全流程原理。从 LLM 的知识截止、私有知识缺失与幻觉讲起,把 RAG 拆成「离线存储」与「在线检索」两大阶段:切块的六种策略与父子块、Embedding 三代演进(Word2Vec/BERT/BGE-M3)与多向量检索、向量库的 HNSW/IVF/PQ 三大索引、Bi-Encoder 与 Cross-Encoder 的取舍、Rerank 精排、BM25+向量的混合检索与融合、查询改写,以及检索与生成两层评测指标、RAGAS 框架和幻觉的不确定性量化。
Java 并发基础全解:从进程与线程到多线程、线程安全与死锁
并发是一座楼,地基是"进程与线程"。本文按"先概念、后原理、再问题"的顺序,从进程与线程是什么讲起,逐层拆开线程私有/共享的资源、Java 线程与操作系统线程的映射、并发与并行、多线程的收益与代价,直到线程生命周期、上下文切换、线程安全与死锁,配全流程图、状态转换表与可运行代码。
一文搞懂 Spring AI Alibaba Graph:状态驱动的 AI Agent 编排引擎
从 ReAct 快速入门到核心概念拆解,讲透 Spring AI Alibaba Graph 状态驱动的图编排引擎:OverAllState、NodeAction、条件边与 Dispatcher、并行扇出扇入、Checkpoint 持久化与中断恢复(HITL),附完整装配示例与避坑清单。
Agent 核心概念全解:从 Workflow 之辨到大脑·规划·记忆·工具
从 Workflow 与 Agent 的本质区别(确定性的下一步 vs 不确定的下一步)切入,系统讲解 Agent 的四大核心组成:大脑(LLM)、记忆、工具(Function Calling/MCP/Skill/渐进式披露)、规划(ReAct/Plan-and-Execute/Reflection/Multi-Agent/A2A),并说明这些架构不是互斥选项而是可叠加的积木。
Redis 为什么又快又省内存?五大类型底层结构与编码切换全解
Redis 的快和省,藏在"一套接口、多套内核"的设计里:数据小用紧凑结构省内存,数据大自动切换高性能结构。本文拆解 SDS、跳表、哈希表、listpack 等八种底层结构的来龙去脉,给出五大类型完整的编码切换阈值表与版本演进脉络,并配全命令示例和业务场景。
秒杀系统设计(三):规模扩展——库存分片与容量规划
前两篇的方案,都建立在"一个商品、库存 100 件"这个前提上。作为系列第三篇,本文先讨论前提被打破时怎么办:大库存怎么做库存分桶(DB 侧与 Redis 侧,以及路由算法必须一致这条铁律)、多商品怎么分库分表、分片最大的坑"分桶不均导致少卖"的两种解法(预留兜底桶与桶间借调);再回答最实际的问题——基于压测基线与漏斗衰减,逐层算出到底要几台机器。
秒杀系统设计(二):数据正确性——防超卖、分布式锁与一人一单
流量问题解决后,系统活下来了,但不代表数据是对的。作为系列第二篇,本文解决秒杀里两件"必须正确"的事:一是库存不能超卖——从 Redis 侧的 Lua 原子扣减,到数据库侧的四种并发控制方案(悲观锁、乐观锁、CAS 原子 SQL、分布式锁)、三种锁的等待机制,以及"锁必须放在事务外"等三个坑点;二是一人只能有一单——三种实现方案、幂等设计,以及超时未支付的库存回补。





