2012-06-19 6 views
5

Ich habe eine Netty-App, wo ich mehr als einen Thread haben möchte, um in einen Kanal zu schreiben. Ich habe mich nur gefragt, ob Channel.write threadsicher ist?Ist Netty Channel.write Thread sicher?

+0

http://StackOverflow.com/A/10702210/828625 –

+0

Ich weiß nicht, ich könnte falsch liegen. Aber dieses http://lists.jboss.org/pipermail/netty-users/2008-November/000045.html scheint die Bemerkungen in dem von Ihnen zitierten Thread zu widersprechen. –

+1

Noch einmal, was du verlinkt hast, sagt dasselbe und beantwortet deine Frage. Channel.write ist Thread-sicher. –

Antwort

2

Es ist Thread-sicher, so dass Sie sich keine Sorgen machen müssen.

0

Nein, es ist Thread-unsicher, weil Channel.writeChannelOutboundBuffer.addMessage in seiner HeadContext-Pipeline ruft, und ChannelOutboundBuffer.addMessage ist definitiv Thread-unsicher. Werfen Sie einen Blick auf diesen Code:

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

also sollte man höchstens einen Thread haben, der jederzeit Channel.write aufruft. Es stimmt etwas nicht mit dem Format des Codes, Sie können es auf http://netty.io/4.0/xref/index.html finden – yuguoliang

+0

Ich bin nicht in der Lage, Ihren Anspruch zu bestätigen. Ich sehe, dass "AbstractChannel.write" 'Pipeline.write' aufruft, das schließlich' AbstractUnsafe.write' aufruft, nachdem es die Ereignisschleife für diesen Kanal erhalten hat. Innerhalb dieser Methode gibt es eine Behauptung, dass der Thread innerhalb der Ereignisschleife ist, so dass er nur zu jeweils einem Thread aufgerufen werden kann – Ferrybig

3

Wie Sie aus dem Code sehen können, die ChannelOutboundBuffer.addMessage() Verfahren selbst ist nicht Thread-sicher. Der Schreibkanal ist jedoch "threadsicher", weil Netty die Schreibaufgabe/Methode im einzelnen I/O-Thread ausführt.