Java Netty Channel.write线程安全吗?

Java Netty Channel.write线程安全吗?,java,thread-safety,netty,channel,Java,Thread Safety,Netty,Channel,我有一个Netty应用程序,我希望有多个线程向一个频道写入。我只是想知道Channel.write是否是线程安全的 它是线程安全的,所以您不必担心。不,它是线程不安全的,因为Channel.write在其管道的头上下文中调用ChannelOutboundBuffer.addMessage,而ChannelOutboundBuffer.addMessage肯定是线程不安全的。请查看以下代码: public void addMessage(Object msg, int size, Channel

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

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

不,它是线程不安全的,因为
Channel.write
在其管道的头上下文中调用
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);
 }

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

我不知道,我可能错了。但这似乎与你引用的帖子中的评论相冲突。同样,你链接的内容说明了同样的事情,并回答了你的问题。Channel.write是线程安全的。因此,在任何时候,您最多应该有一个线程调用Channel.write。代码的格式有问题,你可以在上面找到,我无法确认你的说法。我看到
AbstractChannel.write
调用了
Pipeline.write
,在获取了该通道的事件循环后,它最终调用了
AbstractUnsafe.write
。在这个方法中有一个断言,表示线程在事件循环中,因此一次只能由一个线程调用它