Потокобезопасность в потоках Netty, обслуживающих разные (но не сосуществующие) каналы.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Потокобезопасность в потоках Netty, обслуживающих разные (но не сосуществующие) каналы.

Сообщение Anonymous »


У меня есть приложение, которое использует Netty с NIO. Клиент создает Bootstrap следующим образом:

Bootstrap clientBootstrap = новый Bootstrap(); clientBootstrap.group(clientWorkerGroup) .channel(NioSocketChannel.класс) .option(ChannelOption.SO_KEEPALIVE, clientConfiguration.soKeepAlive()) // и так далее где clientWorkerGroup создается следующим образом: new NioEventLoopGroup(threadFactory). В результате создается группа циклов событий с числом потоков по умолчанию, превышающим 1, поэтому возможен параллелизм между «клиентскими потоками Netty».

Приложение время от времени создает Каналы (на серверы). Реализации ChannelOutboundHandler и ChannelInboundHandler добавляются в конвейер при открытии Channel; как входящие, так и исходящие обработчики имеют доступ к некоторому общему изменяемому состоянию (наиболее интересная часть этого состояния — небезопасная для потоков Queue), доступ к этому состоянию не синхронизируется. Каждый объект состояния соответствует не более одному активному Каналу одновременно.

Если я правильно понимаю, это означает, что пока Канал жив, соответствующие ему входящие/исходящие обработчики работают в одном потоке, поэтому проблем с многопоточностью быть не должно. (1)

Но после закрытия существующего Канала может быть открыт другой, и ему (согласно логике приложения) будет присвоен объект состояния, с которым более ранний Канал обработчики работали. Таким образом, обработчики нового Канала теперь будут обращаться к уже существующему объекту состояния, возможно, в потоке, отличном от того, который использовался обработчиками первого Канала. (2)

Я хотел бы спросить следующее:
[*]Правда ли то, что я описал в абзаце, отмеченном (1)? То есть, если к объекту состояния обращаются только обработчики одного и того же Канала (и канал не перерегистрируется, никогда не меняет свой цикл событий), гарантирует ли это потокобезопасность относительно этого состояния? объекты? [*]Если разные каналы (но никогда одновременно) получают доступ к одному и тому же объекту состояния (как описано в (2)), нарушается ли это гарантия, или Netty каким-то образом удается ее предоставить? [*]Если гарантия нарушена, есть ли способ восстановить ее (но без оплаты затрат на явную синхронизацию объектов состояния и/или примитивов параллелизма, таких как параллельные коллекции)?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»