Frage

Ich habe eine Frage zur Parallelität in vorgelagerten/nachgelagerten Handlern eines Kanalrohrs. Ich dachte immer, wenn ein neuer Handler erstellt wird, wenn das Rohr gebaut wird (dh der Handler wird nicht unter den Rohren geteilt), interagiert höchstens ein Faden mit dem Handler.

Jetzt habe ich die Beispiele durchgesehen. Genauer gesagt, nehmen Sie Folgendes: http://docs.jboss.org/netty/3.2/xref/org/jboss/nety/example/discard/discardserverhandler.html

Im Code gibt es eine Mitgliedsvariable (sie wird verwendet, um die Gesamtzahl der Bytes zu zählen):

private final AtomicLong transferredBytes = new AtomicLong();

Warum verwenden sie hier einen Atomiclong? Der Handler ist wie folgt konstruiert (siehe http://docs.jboss.org/netty/3.2/xref/org/jboss/nety/example/discard/discardserver.html):

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

Der Handler wird also nicht geteilt. Ich kann keinen Grund finden, warum sie hier einen Atomiclong anstelle eines langen langwierigen Gebrauchs verwenden möchten. Kann jemand erklären?

Vielen Dank!

War es hilfreich?

Lösung

Es ist ein "Fehler" im Beispiel. Der Atomiclong ist hier nicht erforderlich. Sie haben also Recht. Wenn Sie bei jeder ChannelPipeline -Erstellung eine neue Instanz des Handlers hinzufügen, sollten Sie sich nicht mit dieser Art von Parallelitätsproblemen befassen.

Ich werde das Beispiel in Netty beheben. Vielen Dank!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top