netty channel的線程安全性與@Sharable

 

1. Bootstrap中直接添加sb.childHandler(new MySimpleChannelInboundHandler())html

這個childHandler都是同一個實例,也就說會致使不一樣的channel用了同一個handler安全

 

2. netty的一大好處就是每個channel都有本身綁定的eventloop和channelHandler,這樣能夠保證代碼串行執行,沒必要考慮併發同步的問題。多線程

 

3. 只要寫個類繼承ChannelInitializer就好了,ChannelInitializer這個類比較特殊,你能夠把它想象成是不少channelhandler的集合體,並且這個類就是@Shareable的,繼承了這個類以後你能夠爲每個channel單首創建handler,甚至是多個handler。併發

雖然全部的channel都共享了ChannelInitializerImpl這個實例,可是這個實例卻能爲每個channel new出新的handler實例,這就是區別。oop

 

https://www.fanyeong.com/2016/10/24/netty-channelhandler%E4%BD%BF%E7%94%A8%E6%8A%A5%E9%94%99/spa

 

4. 也並非說ChannelInitializer就能夠不用@Sharable了,要視具體狀況而看,若是ChannelInitializer中仍是同一個handler實例,就不行.net

https://blog.csdn.net/supper10090/article/details/78431948線程

 

5. 爲了安全地被用於多個併發的Channel(即鏈接),sharable註解的ChannelHandler必須是線程安全的。netty

每個新建立的Channel都將會被分配一個新的ChannelPipeline,但其中的handler未必是htm

https://www.jianshu.com/p/b241e3800fc0

 

6. 若是ChannelHandler被註解爲 @Sharable,全局只有一個handler實例,它會被多個Channel的Pipeline共享,會被多線程併發調用,所以它不是線程安全的;若是存在跨ChannelHandler的實例級變量共享,須要特別注意,它可能不是線程安全的。

在整個ChannelPipeline執行過程當中,可能會發生線程切換。此時,若是同一個對象在多個ChannelHandler中被共享,可能會被多線程併發操做

https://blog.csdn.net/y_xianjun/article/details/48341749

 

7. 總之,只應該在肯定了你的 ChannelHandler 是線程安全的時才使用@Sharable 註解 

http://www.cnblogs.com/krcys/p/9297092.html

 

8. 新建一個Channel時會自動新建一個ChannelPipeline,也就是說他們之間是一對一的關係。另外須要注意的是:ChannelPipeline是線程安全的,也就是說,咱們能夠動態的添加、刪除其中的ChannelHandler。

個人理解:channel屬於一個線程,ChannelPipeline屬於一個channel,因此對ChannelPipeline的操做始終在一個線程內

Sharable註解的使用是有限制的,多個ChannelPipeline只有一個實例,因此該Handler要求 無狀態。不能使用或改變自己的私有變量,由於ChannelHandler是 非線程安全的,使用私有變量會形成線程競爭而產生錯誤結果。


連接:https://www.jianshu.com/p/7dc5da98694c

 

9. 看書

channelpipeline 始終在一個線程操做

紅色框劃重點

 

概括就是:

(1)channel-1vs 1 pipeline-new handler

(2)channel-1vs 1 pipeline-common handler,須要@Sharable,且確保線程安全無成員變量

(3)channel始終在一個線程中,pipeline也是,但handler未必是

 

下面補充一個關於channel與線程的實踐  9.6

https://www.cnblogs.com/silyvin/articles/9599778.html

相關文章
相關標籤/搜索