知其然,知其所以然
Java 内部原理 2026-09-19

ThreadLocalRandom真实验证:并发场景下真实快了184倍

真实用8线程各调用500万次nextInt(),共享一个Random实例真实耗时7935ms,改用ThreadLocalRandom.current()真实只要43ms,真实快184.53倍;真实验证同一线程内两次ThreadLocalRandom.current()调用返回同一个实例,不同线程各自拿到独立、不需要竞争的随机数生成器。

Java 并发 性能 动画演示
Gin 框架内部原理 2026-09-18

Gin 中间件链:c.Next() 和 c.Abort() 的洋葱模型到底是怎么实现的

本机真实 Go 1.26.6 + gin-gonic/gin v1.12.0 程序验证洋葱模型的进入/退出顺序、Abort() 的真实语义、用 unsafe.Pointer 探测 c.index 的完整轨迹、63 个 handler 的硬性上限,以及 RouterGroup 中间件继承机制,对照真实源码。

中间件 洋葱模型 动画演示
Java 内部原理 2026-09-18

Arrays.fill()真实陷阱:填充二维数组的每一行,真实变成了同一个数组的三个引用

真实验证Arrays.fill(int[][] arr2d, int[] sharedRow)这个合法调用真实把每一行都指向同一个数组对象,不是三个独立副本;真实修改arr2d[0][0]后,其余两行真实一起被改变;真实对比正确写法(for循环对每行单独调用Arrays.fill)才能得到三个真正独立的行数组。

Java 数组 陷阱 动画演示
Gin 框架内部原理 2026-09-17

Gin 路由树:一棵压缩前缀树是怎么把 URL 匹配做到跟路由总数无关的

本机真实拉取 gin-gonic/gin v1.12.0,用 unsafe.Pointer + 反射挖出未导出的路由树结构,验证路径压缩、参数冲突 panic、priority 优先级重排,并实测查找耗时跟路由总数无关,对照真实源码。

路由 radix tree 动画演示
Django 2026-09-17

as_view():一个类怎么变成一个函数视图,dispatch() 又是怎么反射调出对应方法的

本机真实实测 as_view() 每次请求都新建一个实例、参数校验发生在注册阶段而不是请求阶段、dispatch() 靠 getattr 反射分派方法且未定义的方法真实走 405、get 没定义 head 会自动复用、混用同步异步 handler 真实报错,以及装饰器加在 dispatch 上属性会被复制到最外层函数。

CBV as_view 动画演示
Java 内部原理 2026-09-17

接口默认方法菱形冲突真实验证:不显式覆盖,编译器真实直接拒绝编译

真实复现类C实现两个互不相关的接口A和B、都定义了同名默认方法greet()却不覆盖时,javac真实拒绝编译并报错;真实验证用A.super.greet()语法可以显式调用指定接口的默认实现;真实验证接口存在真实父子关系时,更具体的子接口默认方法会自动胜出。

Java 接口 default方法 动画演示
Django 2026-09-16

事务与 on_commit():post_save 信号里干的事,可能比事务提交还早发生

本机真实实测 on_commit() 在没有事务时会立刻执行、嵌套 atomic() 用 savepoint 隔离回滚、内层回滚会让注册在其中的 on_commit 回调被直接丢弃,以及用 bigywater 项目自己的 Post 模型证明 post_save 信号在事务提交前就已经真实执行,回滚后数据库记录消失但信号写的文件还留在磁盘上。

事务 on_commit 动画演示
MySQL / InnoDB 2026-09-16

乐观锁重试:版本号检查失败后,为什么必须重新查一次,不能拿着旧版本号硬撞

真实用 SQLite + 多线程复现乐观锁的完整对照:裸读改写在并发下真实丢失 180/200 次更新;加了 version 校验但不重试,79 次成功、121 次被安静放弃;完整重试循环(重新读+重新算+重新写)真实做到 200/200 分毫不差,平均重试 3.04 次;拿着旧版本号硬撞的错误重试,真实卡死 82 次永远失败。

乐观锁 并发 动画演示
Java 内部原理 2026-09-16

静态字段隐藏真实验证:字段访问真实按引用的声明类型决定,和方法多态完全不同

真实验证Parent p = new Child()时,p.label(静态字段)和p.instanceLabel(实例字段)真实都按引用的声明类型Parent决定;真实验证同样的p.describe()方法调用却真实按对象的运行时类型Child决定,证明Java字段访问不支持多态,只有方法调用才支持。

Java 继承 多态 动画演示
Django 2026-09-15

Forms 校验流水线:一个字段挂了,其它字段会不会被跳过?clean() 里忘记判空为什么会真实抛 KeyError

本机真实实测 Django Form 校验是收集所有字段错误而不是遇到第一个就停、一个字段身上多个 validator 的失败会被一次性收集、Form.clean() 里直接用下标取 cleaned_data 会真实抛 KeyError,以及 errors 惰性缓存的真实行为。

Forms 校验 动画演示
Java 内部原理 2026-09-15

多维数组内存真实验证:Java的二维数组真实是"数组的数组",不是连续内存块

真实验证Java的int[3][4]类型真实是[[I(数组的数组),不是C语言那种连续内存块;真实验证每一行都是独立的数组对象,可以整体替换成不同长度的新数组;真实计算1000x1000的二维数组真实创建了1001个独立数组对象,而等效的一维数组只创建1个。

Java 数组 JVM 动画演示
Django 2026-09-14

Migrations:makemigrations 到底在跟什么比,一次字段改名为什么会被当成删了又加

本机真实实测 makemigrations 从不查真实数据库、非交互模式下字段改名被当成删+加直接放弃、跨 app 迁移依赖图决定真实执行顺序、SQLite 加字段是否走快速 ALTER TABLE 与 --fake 的真实效果。

Migrations 依赖图 动画演示
京ICP备2026067502号-1京公网安备11010502063487号