2012-06-19 14 views
5

私はNettyアプリを持っています。そこには複数のスレッドをチャンネルに書きたいと思っています。私はちょうどChannel.writeがスレッドセーフであるかどうか疑問に思っていましたか?Netty Channel.writeはスレッドセーフですか?

+0

http://stackoverflow.com/a/10702210/828625 –

+0

私は間違っているかもしれません。しかし、このhttp://lists.jboss.org/pipermail/netty-users/2008-November/000045.htmlはあなたが引用したスレッドの発言と矛盾するようです。 –

+1

また、あなたがリンクしていることは同じことを言い、あなたの質問に答えます。 Channel.writeはスレッドセーフです。 –

答えて

2

スレッドセーフなので気にする必要はありません。

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を呼び出すスレッドは最大で1つあります。コードのフォーマットに問題があります。http://netty.io/4.0/xref/index.htmlにあります。 – yuguoliang

+0

あなたの主張を確認することができません。 'AbstractChannel.write'は' Pipeline.write'を呼び出し、そのチャンネルのイベントループを取得した後、最終的に 'AbstractUnsafe.write'を呼び出します。このメソッドの内部では、スレッドがイベントループの内部にあるというアサーションがあるので、一度に1スレッドだけ呼び出すことができます – Ferrybig

3

を、ChannelOutboundBuffer.addMessage()方法自体はスレッドセーフではありません。しかし、書き込みチャネルは "スレッドセーフ"である。なぜなら、Nettyは単一のI/Oスレッドで書き込みタスク/メソッドを実行するからである。