Pregunta

Tengo una pregunta sobre la concurrencia en los manejadores aguas arriba/aguas abajo de una tubería de canal. Siempre pensé que si se crea un nuevo controlador cuando se construye la tubería (es decir, el controlador no se comparte entre las tuberías), como máximo un hilo interactúa con el controlador.

Ahora, estaba navegando por los ejemplos. Más específico, toma este: http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/discard/discardserverhandler.html

En el código, hay una variable miembro (se utiliza para contar el número total de bytes):

private final AtomicLong transferredBytes = new AtomicLong();

¿Por qué usan un atómico aquí? El controlador se construye como lo siguiente (ver http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/discard/discardserver.html):

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
    public ChannelPipeline getPipeline() throws Exception {
        return Channels.pipeline(new DiscardServerHandler());
    }
 });

Entonces, el controlador no se comparte. No puedo encontrar una razón por la que querrían usar un atómico, en lugar de una llanura larga, aquí. ¿Alguien puede explicar?

¡Gracias!

¿Fue útil?

Solución

Es un "error" en el ejemplo. No hay necesidad de la atómica aquí. Entonces tienes razón. Si agrega una nueva instancia del controlador en cada creación de canales de canal, no debe necesitar molestarse con este tipo de problemas de concurrencia.

Arreglaré el ejemplo en Netty. ¡Gracias!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top