Потокобезопасность в потоках Netty, обслуживающих разные (но не сосуществующие) каналы. ⇐ JAVA
-
Anonymous
Потокобезопасность в потоках Netty, обслуживающих разные (но не сосуществующие) каналы.
У меня есть приложение, которое использует 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 каким-то образом удается ее предоставить? [*]Если гарантия нарушена, есть ли способ восстановить ее (но без оплаты затрат на явную синхронизацию объектов состояния и/или примитивов параллелизма, таких как параллельные коллекции)?
У меня есть приложение, которое использует 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 каким-то образом удается ее предоставить? [*]Если гарантия нарушена, есть ли способ восстановить ее (но без оплаты затрат на явную синхронизацию объектов состояния и/или примитивов параллелизма, таких как параллельные коллекции)?
Мобильная версия