Frage

Die Netty -Dokumentation schlägt vor, Instanzvariablen in ChannelHandlern zu verwenden, um den Kanalstatus im Auge zu behalten. Es wird nicht erwähnt, dass Sie volatile Variablen verwenden oder eine andere Synchronisationstechnik verwenden sollten, um sicherzustellen, dass eine konsistente Ansicht über Threads hinweg besteht.

Zum Beispiel mit diesem Handler auf der Basis von Konnektionen:

class Handler extends SimpleChannelUpstreamHandler {
        int count = 0;

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

Ich würde erwarten, dass viele verschiedene Threads aus einem Netty -Thread -Pool diese Methode aufrufen würden, wenn auch nicht gleichzeitig, und möglicherweise eine inkonsistente Ansicht sehen könnten, was zu einer ungenauen Zählung führt.

Ist das der Fall? Oder gibt es eine Art Synchronisation in Netty, die dazu führen würde, dass das Schreiben in das Grafenfeld gespült wird?

War es hilfreich?

Lösung

Wenn Sie keinen Testamentsvollstrecker in Ihrer Pipeline haben und Ihre Handler nur in den E/A -Worker -Threads ausführen, sind Sie in Ordnung, da Netty garantiert, dass eine bestimmte Pipeline -Instanz immer vom selben Arbeiter -Thread zurückgerufen wird.

Wenn Sie Ihrer Pipeline einen Ausführungshandler hinzufügen, sind Sie in Ordnung, wenn Sie Netty's OrderedMemoryAwarethreadpoolexecutor verwenden.

Wenn Sie auf Ihre Pipeline aus einem Nicht-Netty-Thread zugreifen oder einen nicht ordnungsgemäßen MemoryAwarethreadpoolexecutor in Ihrer Pipeline haben, benötigen Sie eine Synchronisation.

Ich empfehle, die folgenden Threads im Netty User Forum Archives zu schauen.

http://netty.markmail.org/search/?q=Memory+ VISIBILIALISIBILIEN+in+handlers#query:Memory%20Visibility%20in%20Handlers+ Page:1+Mid:cmtw5omcxbg67sho+State:Results

http://netty.markmail.org/search/?q=periodic%20TimerTask%20in#query:periodic%20TimerTask%20in+Page:2+Mid:vwahepiois4eqwkp+state:Results

Andere Tipps

Wenn Sie ein Netty erstellen ChannelPipeline Wenn Sie die hinzufügen gleich Instanz von dir Handler An allen Kanälen, ja, lesen/ändern mehrere Threads Ihre Daten.

Wenn Sie eine neue Instanz von erstellen Handler pro Kanal in Ihrer Pipeline, wie unten gezeigt, dann sind Sie nur in Sicherheit Ein Thread wird auf den Handler in der zugreifen Pipeline zu einer Zeit dann.

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

Schauen Sie sich auch Netty an Channellocal, es ist wie Java ThreadLocal und Sie können den Status pro Kanalbasis festlegen

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