私はNettyアプリを持っています。そこには複数のスレッドをチャンネルに書きたいと思っています。私はちょうどChannel.writeがスレッドセーフであるかどうか疑問に思っていましたか?Netty Channel.writeはスレッドセーフですか?
答えて
スレッドセーフなので気にする必要はありません。
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を呼び出すスレッドは最大で1つあります。コードのフォーマットに問題があります。http://netty.io/4.0/xref/index.htmlにあります。 – yuguoliang
あなたの主張を確認することができません。 'AbstractChannel.write'は' Pipeline.write'を呼び出し、そのチャンネルのイベントループを取得した後、最終的に 'AbstractUnsafe.write'を呼び出します。このメソッドの内部では、スレッドがイベントループの内部にあるというアサーションがあるので、一度に1スレッドだけ呼び出すことができます – Ferrybig
を、ChannelOutboundBuffer.addMessage()
方法自体はスレッドセーフではありません。しかし、書き込みチャネルは "スレッドセーフ"である。なぜなら、Nettyは単一のI/Oスレッドで書き込みタスク/メソッドを実行するからである。
http://stackoverflow.com/a/10702210/828625 –
私は間違っているかもしれません。しかし、このhttp://lists.jboss.org/pipermail/netty-users/2008-November/000045.htmlはあなたが引用したスレッドの発言と矛盾するようです。 –
また、あなたがリンクしていることは同じことを言い、あなたの質問に答えます。 Channel.writeはスレッドセーフです。 –