我有一个使用Netty编写的应用程序,我希望在一个通道上有多个线程进行写操作。我想知道Channel.write()方法是否线程安全?
我有一个使用Netty编写的应用程序,我希望在一个通道上有多个线程进行写操作。我想知道Channel.write()方法是否线程安全?
从代码中可以看出,ChannelOutboundBuffer.addMessage()
方法本身不是线程安全的。但是,写操作是“线程安全”的,因为Netty会将写入任务/方法在单个I/O线程中执行。
它是线程安全的,所以您不需要担心。
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);
}
AbstractChannel.write
调用Pipeline.write
,最终调用AbstractUnsafe.write
,在获取该通道的事件循环之后。在此方法内部,有一个断言,即线程在事件循环内部,因此它只能被一个线程调用。 - Ferrybig