夜雨聆风学习资料网

ARTICLE · 1113415

Tomcat9源码剖析(二): 隐藏在源码里设计

Tomcat9源码剖析(二): 隐藏在源码里设计

看 Tomcat 源码,最绝的不是架构,是每隔几百行就冒出几行“踩过坑才写得出来”的细节。

比如 Poller 线程往 selector 注册连接。常规做法是直接唤醒,但 wakeup() 代价挺大。Tomcat 用一个原子变量做计数器,CAS 一次就把要不要唤醒、要不要阻塞全判断了,省掉多余的系统调用。

再比如派发 socket 给工作线程前,必须先清掉就绪事件。不清的话,两个线程会同时读同一个 SocketChannel,轻则数据错乱,重则未定义行为。这是写 NIO 服务端的铁律。

还有线程池扩容。JDK 默认先塞队列再建线程,Tomcat 重写 offer() 故意返回 false,硬生生撬动它先扩容后排队。另外像解析请求行做成可续跑状态机、超时检查只扫最早到期时间,全是省 CPU 的狠活。

这些代码注释比正文还长,防的都是极难复现的毛病。

原文Tomcat 9 源码剖析(二):隐藏在源码里设计技巧
河南,52分钟前,

相关学习资料