Hello, I am
king-of-water.

从代码出发,理解系统与行业。

HashMap 与 ConcurrentHashMap:从哈希到并发安全

从「hash 值不等于索引位置」讲起,深入 HashMap 源码:put 完整流程、扩容 resize 的高低位拆分、树化与退化阈值、红黑树五条性质、负载因子 0.75 的权衡、JDK 7 头插死循环;再深入 ConcurrentHashMap:分段锁到 CAS+synchronized、为什么用 synchronized 而不是 ReentrantLock、sizeCtl 与 ForwardingNode 与 transfer 的多线程协同扩容、get 无锁与 baseCount+CounterCell 计数;最后补 LinkedHashMap 的 LRU 与被淘汰的 Hashtable。

JavaHashMapConcurrentHashMap哈希红黑树负载因子扩容resize分段锁CASForwardingNodesizeCtlLinkedHashMapLRUHashtable

动态代理:JDK 代理与 CGLIB

从 Proxy.newProxyInstance 的三个参数讲起,拆开生成的 $Proxy0 类长什么样、InvocationHandler 怎么被回调;再讲 CGLIB 的 Enhancer 三步、生成的子类结构、MethodProxy 与 invokeSuper/invoke 的区别和 FastClass 机制;对比两者的限制、性能,以及 Spring AOP 的选择规则和自调用事务失效。

Java动态代理JDK 代理CGLIBInvocationHandlerMethodInterceptorProxySpring AOP字节码FastClass

垃圾回收算法与收集器:从 Serial 到 ZGC

从可达性分析讲起,拆解标记-清除、复制、标记-整理三种基础 GC 算法,说明分代收集为什么新生代用复制、老年代用整理,再沿 Serial、Parallel、CMS、G1、ZGC 的演进讲清吞吐量优先与低停顿优先两条路线,最后给出收集器选型。

JavaGC垃圾回收标记清除复制算法标记整理G1ZGCCMS分代收集

synchronized 与 ReentrantLock:锁升级与 AQS

从 synchronized 的 Monitor 与 Mark Word 讲起,拆解无锁、偏向锁、轻量级锁、重量级锁的升级过程;再把 ReentrantLock 的底座 AQS 摊开——state、CLH 队列、acquire/addWaiter/acquireQueued/release 逐行讲解,公平锁与非公平锁的源码差异,可重入怎么实现,Condition 的双队列,最后是 CAS 与 ABA。

JavasynchronizedReentrantLockAQSCAS锁升级偏向锁轻量级锁MonitorConditionCLHABA

ThreadLocal:线程私有变量、ThreadLocalMap 与内存泄漏

深入 ThreadLocal 源码:ThreadLocalMap 的开放地址法与线性探测、threadLocalHashCode 的黄金分割散列、set/get 的完整流程、Entry 的弱引用 key 与强引用 value 的引用链、expungeStaleEntry/cleanSomeSlots/rehash 的清理与扩容,以及内存泄漏的精确成因。

JavaThreadLocalThreadLocalMap线性探测弱引用强引用expungeStaleEntry内存泄漏InheritableThreadLocal