【Netty源码解读和权威指南】第60篇:Netty并发编程实践——多线程安全的正确姿势

发布时间:2026/6/25 22:28:54

【Netty源码解读和权威指南】第60篇:Netty并发编程实践——多线程安全的正确姿势 上一篇【第59篇】RecvByteBufAllocator源码解析——动态调整接收缓冲区下一篇【第61篇】Netty性能调优——从10万到100万连接的优化之路一、EventLoop单线程模型Netty的线程安全基石同一个Channel的所有I/O事件都由同一个EventLoop线程处理。// ✅ 安全在EventLoop线程中执行ctx.executor().execute(()-{ctx.writeAndFlush(msg);// 线程安全});// ❌ 危险在其他线程中修改ChannelnewThread(()-{ctx.writeAndFlush(msg);// 可能线程不安全}).start();二、Sharable注解// 无状态的Handler可以标记Sharable被多个Channel共享ChannelHandler.SharablepublicclassStatelessHandlerextendsChannelInboundHandlerAdapter{// ✅ 不能有成员变量// ✅ 可以在所有Channel间共享}// 有状态的Handler不能标记SharablepublicclassStatefulHandlerextendsChannelInboundHandlerAdapter{privateintcounter;// ← 状态变量不能Sharable}三、正确的线程切换publicclassBusinessThreadHandlerextendsChannelInboundHandlerAdapter{privateExecutorServicepoolExecutors.newFixedThreadPool(10);publicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){pool.submit(()-{// 1. 在业务线程中执行耗时操作ObjectresultdoBusiness(msg);// 2. 结果写回EventLoop线程ctx.executor().execute(()-{ctx.writeAndFlush(result);});});}}四、volatile的正确使用// Netty中大量使用volatile保证可见性publicclassAbstractChannel{privatevolatileEventLoopeventLoop;// volatileprivatevolatilebooleanregistered;// volatile}publicclassDefaultPromiseV{privatevolatileObjectresult;// volatile CASprivatevolatileintwaiters;// volatile}五、总结原则说明EventLoop单线程同一Channel操作在同一个线程无状态Sharable多个Channel共享一个Handler切换线程耗时操作→业务池→写回EventLoopvolatileCAS替代synchronized提升性能上一篇【第59篇】RecvByteBufAllocator源码解析——动态调整接收缓冲区下一篇【第61篇】Netty性能调优——从10万到100万连接的优化之路

相关新闻