【问题标题】:Is Netty Channel.write thread safe?Netty Channel.write 线程安全吗?
【发布时间】:2023-03-05 13:47:01
【问题描述】:

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

【问题讨论】:

标签: java thread-safety netty channel


【解决方案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个线程调用
      猜你喜欢
      • 2016-08-18
      • 1970-01-01
      • 2016-08-10
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      相关资源
      最近更新 更多