2012-06-19 22 views
5

Ho un'app Netty, dove voglio avere più di un thread per scrivere su un canale. Mi stavo chiedendo se Channel.write è thread-safe?Il thread Netty Channel.write è sicuro?

+0

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

+0

Non so, potrei sbagliarmi. Ma questo http://lists.jboss.org/pipermail/netty-users/2008-November/000045.html sembra in conflitto con le osservazioni nel thread che hai citato. –

+1

Anche in questo caso, ciò che hai collegato dice la stessa cosa e risponde alla tua domanda. Channel.write è thread-safe. –

risposta

2

È thread-safe, quindi non devi preoccuparti.

0

No, è thread-safe, perché Channel.write chiama ChannelOutboundBuffer.addMessage nel suo HeadContext della pipeline e ChannelOutboundBuffer.addMessage è sicuramente thread-safe. Date un'occhiata a questo codice:

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

quindi dovresti avere al massimo un thread chiamando Channel.write in qualsiasi momento. c'è qualcosa di sbagliato nel formato del codice, puoi trovarlo su http://netty.io/4.0/xref/index.html – yuguoliang

+0

Non riesco a confermare il tuo reclamo. Vedo che 'AbstractChannel.write' chiama' Pipeline.write', che alla fine chiama 'AbstractUnsafe.write', dopo aver acquisito il ciclo degli eventi per quel canale. All'interno di questo metodo si afferma che il thread si trova all'interno del ciclo degli eventi, quindi può essere chiamato solo da 1 thread alla volta – Ferrybig

3

Come si può vedere dal codice, il metodo ChannelOutboundBuffer.addMessage() in sé non è thread-safe. Tuttavia, il canale Writing è "thread safe" perché netty esegue il task/metodo write nel singolo thread I/O.