Netty的Channel.write方法是否线程安全?

7

我有一个使用Netty编写的应用程序,我希望在一个通道上有多个线程进行写操作。我想知道Channel.write()方法是否线程安全?


http://stackoverflow.com/a/10702210/828625 - Kazekage Gaara
我不确定,但这个链接http://lists.jboss.org/pipermail/netty-users/2008-November/000045.html似乎与你引用的主题中的评论有冲突。 - Tarandeep Gill
1
再次强调,你所提供的链接已经说明了同样的事情,并回答了你的问题。Channel.write是线程安全的。 - Kazekage Gaara
3个回答

7

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


3

它是线程安全的,所以您不需要担心。


0
不,它是线程不安全的,因为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);
 }

1
所以同时最多只应该有一个线程调用 Channel.write。如果代码格式有问题,您可以在 http://netty.io/4.0/xref/index.html 上找到它。 - yuguoliang
2
我无法确认你的说法。我看到AbstractChannel.write调用Pipeline.write,最终调用AbstractUnsafe.write,在获取该通道的事件循环之后。在此方法内部,有一个断言,即线程在事件循环内部,因此它只能被一个线程调用。 - Ferrybig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接