日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Netty : writeAndFlush的线程安全及并发问题

發布時間:2023/12/2 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Netty : writeAndFlush的线程安全及并发问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Netty編程時,我們經常會從用戶線程,而不是Netty線程池發起write操作,因為我們不能在netty的事件回調中做大量耗時操作。那么問題來了 –

1, writeAndFlush是線程安全的嗎?

2, 是否使用了鎖,導致并發性能下降呢

?

我們來看代碼 – 在DefaultChannelHandlerContext中

@Overridepublic ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) {DefaultChannelHandlerContext next;next = findContextOutbound(MASK_WRITE);ReferenceCountUtil.touch(msg, next);next.invoker.invokeWrite(next, msg, promise);next = findContextOutbound(MASK_FLUSH);next.invoker.invokeFlush(next);return promise; }

?

在DefaultChannelHandlerInvoker.java中

@Overridepublic void invokeWrite(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {if (msg == null) {throw new NullPointerException("msg");}if (!validatePromise(ctx, promise, true)) {// promise cancelled ReferenceCountUtil.release(msg);return;}if (executor.inEventLoop()) {invokeWriteNow(ctx, msg, promise);} else {AbstractChannel channel = (AbstractChannel) ctx.channel();int size = channel.estimatorHandle().size(msg);if (size > 0) {ChannelOutboundBuffer buffer = channel.unsafe().outboundBuffer();// Check for null as it may be set to null if the channel is closed alreadyif (buffer != null) {buffer.incrementPendingOutboundBytes(size);}}safeExecuteOutbound(WriteTask.newInstance(ctx, msg, size, promise), promise, msg);}}

?

private void safeExecuteOutbound(Runnable task, ChannelPromise promise, Object msg) {try {executor.execute(task);} catch (Throwable cause) {try {promise.setFailure(cause);} finally {ReferenceCountUtil.release(msg);}}}

?

可見,writeAndFlush如果在Netty線程池內執行,則是直接write;否則,將作為一個task插入到Netty線程池執行。

?

《Netty權威指南》寫到
通過調用NioEventLoop的execute(Runnable task)方法實現,Netty有很多系統Task,創建他們的主要原因是:當I/O線程和用戶線程同時操作網絡資源時,為了防止并發操作導致的鎖競爭,將用戶線程的操作封裝成Task放入消息隊列中,由I/O線程負責執行,這樣就實現了局部無鎖化。

?

參考
http://www.cnblogs.com/zemliu/p/3667332.html
http://netty.io/5.0/xref/io/netty/channel/DefaultChannelHandlerInvoker.html
http://www.infoq.com/cn/articles/netty-version-upgrade-history-thread-part/

轉載于:https://www.cnblogs.com/Binhua-Liu/p/5295365.html

總結

以上是生活随笔為你收集整理的Netty : writeAndFlush的线程安全及并发问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。