2012-06-19 14 views
5

Tengo una aplicación de Netty, donde quiero tener más de un subproceso para escribir en un canal. Me preguntaba si Channel.write es seguro para subprocesos¿Netty Channel.write es seguro?

+0

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

+0

No lo sé, podría estar equivocado. Pero este http://lists.jboss.org/pipermail/netty-users/2008-November/000045.html parece estar en conflicto con las observaciones en el hilo que citó. –

+1

Una vez más, lo que ha vinculado dice lo mismo y responde su pregunta. Channel.write es seguro para subprocesos. –

Respuesta

2

Es seguro para subprocesos, por lo que no tiene que preocuparse.

0

No, es inseguro, porque Channel.write llama a ChannelOutboundBuffer.addMessage en HeadContext de su pipeline, y ChannelOutboundBuffer.addMessage es definitivamente inseguro. Echar un vistazo a este código:

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

, por lo que debe tener como máximo un hilo que llame a Channel.write en cualquier momento. hay algo mal con el formato del código, puede encontrarlo en http://netty.io/4.0/xref/index.html – yuguoliang

+0

No puedo confirmar su reclamo. Veo que 'AbstractChannel.write' llama a' Pipeline.write', que eventualmente llama 'AbstractUnsafe.write', después de que adquirió el bucle de evento para ese canal. Dentro de este método hay una afirmación de que el hilo está dentro del bucle de evento, por lo que solo se puede llamar por 1 hilo a la vez – Ferrybig

3

Como se puede ver en el código, el método ChannelOutboundBuffer.addMessage() sí mismo no es hilo de seguridad. Sin embargo, Writing channel es "thread safe" porque netty ejecuta la tarea/método de escritura en la única cadena de E/S.