При работе с сокетами NIO в Java, после подключения я могу либо зарегистрироваться для операций чтения и записи, и просто ничего не делать, когда получаю уведомление о записи, и у меня ничего нет в исходящем буфере, или я могу зарегистрироваться длятолько чтение уведомлений и перерегистрация для чтения и записи, только когда что-то помещено в исходящий буфер.Я склоняюсь к последнему, но меня волнуют две вещи.
- Влечет ли частая перерегистрация заинтересованных операций какое-либо существенное снижение производительности?
- Может ли перерегистрация заинтересованных операций в другом потоке, отличном от того, который выполняет операции ввода-вывода, представлять какую-либо проблему?
РЕДАКТИРОВАТЬ:
На самом деле со мной произошла еще одна.Для правильной работы мне нужно включить регистрацию записи в потоке, добавляющем исходящие данные в сокет, а в потоке связи мне нужно отключить регистрацию записи, когда исходящая очередь пуста.Однако это оставляет открытым следующий сценарий
IO Thread Other Thread
Check if buffer empty
Add Item to buffer
Register for write notification
Turn off write notifications
Единственный способ избежать этого - включить синхронизацию потоков в самом буфере, чтобы изменения (или проверка) буфера и изменение регистрации происходили на основена этом становится атомная операция.