Netty Channel.write 线程安全吗?

Posted

技术标签:

【中文标题】Netty Channel.write 线程安全吗?【英文标题】:Is Netty Channel.write thread safe? 【发布时间】:2012-06-21 03:25:32 【问题描述】:

我有一个 Netty 应用程序,我希望有多个线程写入一个通道。我只是想知道 Channel.write 是否是线程安全的?

【问题讨论】:

***.com/a/10702210/828625 我不知道,我可能错了。但是这个lists.jboss.org/pipermail/netty-users/2008-November/000045.html 似乎与您引用的线程中的言论相冲突。 再次,您所链接的内容说同样的话,并回答了您的问题。 Channel.write 是线程安全的。 【参考方案1】:

从代码中可以看出,ChannelOutboundBuffer.addMessage() 方法本身并不是线程安全的。但是,写入通道是“线程安全的”,因为 netty 在单个 I/O 线程中执行写入任务/方法。

【讨论】:

【参考方案2】:

它是线程安全的,因此您无需担心。

【讨论】:

【参考方案3】:

不,它是线程不安全的,因为Channel.write 在其管道的 HeadContext 中调用 ChannelOutboundBuffer.addMessage,而 ChannelOutboundBuffer.addMessage 绝对是线程不安全的。看看这段代码:

 public void addMessage(Object msg, int size, ChannelPromise promise) 
     Entry entry = Entry.newInstance(msg, size, total(msg), promise);
     if (tailEntry == null) 
         flushedEntry = null;
         tailEntry = entry;
      else 
         Entry tail = tailEntry;
         tail.next = entry;
         tailEntry = entry;
     
     if (unflushedEntry == null) 
         unflushedEntry = entry;
     

     // increment pending bytes after adding message to the unflushed arrays.
     // See https://github.com/netty/netty/issues/1619
     incrementPendingOutboundBytes(size, false);
 

【讨论】:

所以你应该最多有一个线程在任何时候调用 Channel.write。代码格式有问题,可以在netty.io/4.0/xref/index.html找到 我无法确认您的声明。我看到AbstractChannel.write 调用了Pipeline.write,后者最终调用了AbstractUnsafe.write,在它获取了该通道的事件循环之后。这个方法里面有一个断言线程在事件循环里面,所以一次只能被1个线程调用

以上是关于Netty Channel.write 线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

netty:channel.write() 不成功,原因为空

确定一个 netty 客户端。 ctx.Write(obj) 和 ctx.channel().Write(obj) 的区别

案例分享Netty线程安全疑问

如何关闭写作频道

Netty : writeAndFlush的线程安全及并发问题

使用 Netty 编写的有效方法