Domanda

La documentazione Netty suggerire utilizzando variabili di istanza in ChannelHandlers per tenere traccia dello stato del canale. Non menziona che si dovrebbe usare le variabili volatili o utilizzare qualsiasi altra tecnica di sincronizzazione per assicurare che c'è una vista da thread.

Per esempio usando questo gestore su una base per-connection:

class Handler extends SimpleChannelUpstreamHandler {
        int count = 0;

        @Override
        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
            ++count;
        }
}

Mi aspetterei che molti fili diversi da un pool di thread netty sarebbe chiamare questo metodo, anche se non contemporaneamente, e potrebbe vedere una vista incoerente, causando un conteggio imprecisa.

E 'questo il caso? o c'è qualche tipo di sincronizzazione in corso all'interno di Netty che causerebbe la scrittura al campo di conteggio da lavare?

È stato utile?

Soluzione

Se non si dispone di un esecutore a vostra pipeline, e sta eseguendo i gestori nel solo thread di lavoro di I / O, allora si sta bene come garanzie Netty che una determinata istanza pipeline è sempre richiamato dallo stesso thread di lavoro .

Se si aggiunge un gestore di esecuzione per la pipeline allora sei ok se si sta utilizzando OrderedMemoryAwareThreadPoolExecutor di Netty.

Se si accede a vostra pipeline da un thread non Netty, o si dispone di un non-OrderedMemoryAwareThreadPoolExecutor in pipeline, allora avete bisogno di sincronizzazione.

vi consiglio di dare un'occhiata attraverso le seguenti filettature archivi Netty del forum degli utenti.

http://netty.markmail.org/search/?q=Memory+visibility+in+handlers#query:Memory%20visibility%20in%20handlers+page:1+mid:cmtw5omcxbg67sho+ stato: risultati

http://netty.markmail.org/search/?q=Periodic%20TimerTask%20in#query:Periodic%20TimerTask%20in+page:2+mid:vwahepiois4eqwkp+state:results

Altri suggerimenti

Quando si crea un ChannelPipeline Netty se si aggiunge il stesso istanza del Handler a tutti i canali allora sì, più thread leggeranno / modificare i dati.

Se si crea una nuova istanza di Handler per canale nella vostra pipeline come mostrato di seguito, allora siete al sicuro, solo un thread accederanno al gestore nel gasdotto in un momento in poi.

ChannelPipeline p = Channels.pipeline();
pipeline.addLast("handler", new Handler());

Anche dare un'occhiata a Netty ChannelLocal , è come Java ThreadLocal ed è possibile impostare lo stato su una base per canale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top