【Netty源码解读和权威指南】第82篇:ChannelOutboundBuffer源码深度解析——Netty写缓冲区的秘密

上一篇【第81篇】Netty Codec框架源码解析——编解码器是如何设计的
下一篇【第83篇】Netty任务队列MpscQueue源码解析——无锁高并发的秘密


一、三指针设计

unflushedEntry → [Msg1] → [Msg2] → [Msg3] → null (write后) ↑ tailEntry flushedEntry = null addFlush() 后: flushedEntry → [Msg1] → [Msg2] → [Msg3] → null ↑ tailEntry unflushedEntry = null

二、核心源码

// write():添加到队列publicvoidaddMessage(Objectmsg,intsize,ChannelPromisepromise){Entryentry=Entry.newInstance(msg,size,promise);if(tailEntry==null){flushedEntry=null;tailEntry=entry;}else{tailEntry.next=entry;tailEntry=entry;}incrementPendingOutboundBytes(entry.pendingSize);}// addFlush():标记可写入范围publicvoidaddFlush(){flushedEntry=unflushedEntry;unflushedEntry=null;}// doWrite():批量写入SocketprotectedvoiddoWrite(ChannelOutboundBufferin){intwriteSpinCount=config().getWriteSpinCount();// 默认16for(inti=writeSpinCount;i>0;i--){Objectmsg=in.current();// 写入Socket...in.remove();// 移除已写完的Entry}}

三、水位线

// 超过高水位→不可写if(pendingBytes>65536)setUnwritable();// 低于低水位→可写if(pendingBytes<32768)setWritable();

用途:实现背压,防止OOM。


上一篇【第81篇】Netty Codec框架源码解析——编解码器是如何设计的
下一篇【第83篇】Netty任务队列MpscQueue源码解析——无锁高并发的秘密