雖然全部的channel都共享了ChannelInitializerImpl這個實例,可是這個實例卻能爲每個channel new出新的handler實例,這就是區別。oop
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的操做始終在一個線程內
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