Политики регистрации для чтения и записи при работе с сокетами NIO - PullRequest
1 голос
/ 19 февраля 2010

При работе с сокетами NIO в Java, после подключения я могу либо зарегистрироваться для операций чтения и записи, и просто ничего не делать, когда получаю уведомление о записи, и у меня ничего нет в исходящем буфере, или я могу зарегистрироваться длятолько чтение уведомлений и перерегистрация для чтения и записи, только когда что-то помещено в исходящий буфер.Я склоняюсь к последнему, но меня волнуют две вещи.

  • Влечет ли частая перерегистрация заинтересованных операций какое-либо существенное снижение производительности?
  • Может ли перерегистрация заинтересованных операций в другом потоке, отличном от того, который выполняет операции ввода-вывода, представлять какую-либо проблему?

РЕДАКТИРОВАТЬ:

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

      IO Thread                                    Other Thread
  Check if buffer empty
                                               Add Item to buffer
                                           Register for write notification 
Turn off write notifications 

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

1 Ответ

0 голосов
/ 19 февраля 2010

Вы в основном разобрались. Вы хотите включить или выключить режим записи, и требуется синхронизация (или однопоточность).

Еще один момент: пока у вас есть блокировка в «другом потоке», вы должны пытаться писать, прежде чем включить интерес. Часто неблокирующая запись будет успешной, и вы получите эффективность. Они принесут вам больше, чем вы думаете.

...