ARTICLE · 1113415
Tomcat9源码剖析(二): 隐藏在源码里设计
Tomcat9源码剖析(二): 隐藏在源码里设计
看 Tomcat 源码,最绝的不是架构,是每隔几百行就冒出几行“踩过坑才写得出来”的细节。
比如 Poller 线程往 selector 注册连接。常规做法是直接唤醒,但 wakeup() 代价挺大。Tomcat 用一个原子变量做计数器,CAS 一次就把要不要唤醒、要不要阻塞全判断了,省掉多余的系统调用。
再比如派发 socket 给工作线程前,必须先清掉就绪事件。不清的话,两个线程会同时读同一个 SocketChannel,轻则数据错乱,重则未定义行为。这是写 NIO 服务端的铁律。
还有线程池扩容。JDK 默认先塞队列再建线程,Tomcat 重写 offer() 故意返回 false,硬生生撬动它先扩容后排队。另外像解析请求行做成可续跑状态机、超时检查只扫最早到期时间,全是省 CPU 的狠活。
这些代码注释比正文还长,防的都是极难复现的毛病。
原文Tomcat 9 源码剖析(二):隐藏在源码里设计技巧
河南,52分钟前,