1. HikariCP 为什么快,ConcurrentBag 无锁借用、FastList 跳过已检查连接、字节码级优化
HikariCP 为什么快?请解释 ConcurrentBag 无锁借用、FastList 跳过已检查连接以及字节码级优化等原理?
- ConcurrentBag 的无锁借用机制
- FastList 的优化
- 字节码级优化(JIT)
HikariCP 高性能来自多个层面的优化。ConcurrentBag 是核心的无锁容器:它维护一个"未使用连接"列表(threadLocal 缓存 + 共享队列),借用连接时优先从当前线程的 threadLocal 缓存获取(无锁),命中则直接返回,未命中再从共享队列 CAS 获取;显著减少锁竞争。归还连接时加入 threadLocal,使连接倾向于在同一线程复用。FastList 是 HikariCP 自实现的 ArrayList,用于存储 PreparedStatement 的 key,它在移除元素时跳过已检查的连接(remove 时避免遍历),并减少范围检查,性能优于 JDK ArrayList。字节码级优化:HikariCP 通过 JIT 友好的小而内联方法、避免不必要的对象分配、使用同步的细粒度控制,让热点代码能被 JIT 完美内联与优化,减少方法调用开销。此外它还减少连接初始化开销(如 lazy 加载、避免每次校验)。整体上,HikariCP 通过"无锁借用 + 快速数据结构 + JIT 友好"实现了极低延迟。
本题考察 HikariCP 高性能的底层原因。核心是 ConcurrentBag 的无锁借用(threadLocal 缓存)、FastList 的快速遍历、以及 JIT 友好的字节码优化,三者共同降低连接获取开销。