Вопрос

Документация Netty предполагает использование переменных экземпляра в каналах -руках для отслеживания состояния канала. Он не упоминает, что вы должны использовать летучие переменные или использовать любую другую методику синхронизации, чтобы гарантировать, что существует последовательный вид в разных потоках.

Например, используя этот обработчик на основе подключения:

class Handler extends SimpleChannelUpstreamHandler {
        int count = 0;

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

Я ожидаю, что много разных потоков из пула ниток Netty будут вызывать этот метод, хотя и не одновременно, и потенциально могут увидеть непоследовательный взгляд, что приведет к неточному количеству.

Это так? Или внутри нетти какая -то синхронизация, которая приведет к промыванию записи в поле счетов?

Это было полезно?

Решение

Если у вас нет исполнителя в вашем трубопроводе, и вы выполняете ваши обработчики исключительно в потоках работников ввода -вывода, то вы в порядке, так как Netty гарантирует, что данный экземпляр трубопровода всегда вызывает из одного и того же рабочего потока.

Если вы добавляете обработчик выполнения в свой трубопровод, то вы в порядке, если вы используете Netty OrderedMemoryAwarethreadPoolexeCutor.

Если вы обращаетесь к своему трубопроводу из не-сетевого потока, или у вас есть неординированная суммарноризация

Я рекомендую просмотреть следующие потоки в архивах форума пользователей Netty.

http://netty.markmail.org/search/?q=memory+visibility+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

Другие советы

Когда вы создаете Netty ChannelPipeline Если вы добавите такой же экземпляр вашего Handler Для всех каналов, тогда да, несколько потоков будут читать/изменять ваши данные.

Если вы создаете новый экземпляр Handler за канал в вашем трубопроводе, как показано ниже, тогда вы в безопасности, только одна нить получить доступ к обработчику в трубопровод тогда.

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

Также посмотрите на Нетти Channellocal, это как Java ThreadLocal и вы можете установить состояние на графике на канале

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top