天天看點

同步/異步 和 阻塞/非阻塞 的差別

    • 同步
    • 異步
    • 阻塞
    • 非阻塞
    • 結論
    • 四種方式組合及性能分析

同步

發出一個調用時,在沒有得到結果之前,該調用就不傳回。但是一旦調用傳回,就得到傳回值.

異步

調用在發出之後,這個調用就直接傳回了,是以沒有傳回結果。換句話說,當一個異步過程調用發出後,調用者不會立刻得到結果。而是在調用發出後,被調用者通過狀态、通知來通知調用者,或通過回調函數處理這個調用

阻塞

阻塞調用是指調用結果傳回之前,目前線程會被挂起。調用線程隻有在得到結果之後才會傳回。

非阻塞

非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞目前線程

結論

我認為大概是這樣的:

異步/同步是發生在多線程中的.(單線程中的Timer内部實作也是多線程)

阻塞/非阻塞是發生在單線程中的.

同步和阻塞的最大差別就是線程會不會挂起

同步/異步 和 阻塞/非阻塞 的差別

四種方式組合及性能分析

組合方式 性能分析
同步阻塞 最常用的一種用法,使用也是最簡單的,但是I/O性能一般很差,CPU大部分處于控線狀态
同步非阻塞

       提升I/O性能常用的手段,就是将I/O的阻塞改成非阻塞方式,尤其在網絡I/O是長連接配接同時傳輸資料也不是很多的情況下,提升性能非常有效.

       這種方式通常能提升I/O性能,但是會增加CPU消耗,要考慮增加的I/O性能能不能補償CPU的消耗,也就是系統的瓶頸是I/O上還是CPU上.

異步阻塞

       這種方式在分布式資料庫中經常用到,例如,在一個分布式資料庫中記錄一條記錄,通常會有一份是同步阻塞的記錄,還有2~3份備份記錄會寫到其他機器上,這些備份記錄通常都是采用異步阻塞的方式寫I/O.

       異步阻塞對網絡I/O能夠提升效率,尤其像上面這種同時寫多分相同資料的情況

異步非阻塞

       這種組合方式用起來比較複雜,隻有在一些非常複雜的分布式情況下使用,叢集之間的消息同步機制一半用這種I/O組合方式,如Cassandra的Gossip通信機制就是采用異步非阻塞的方式.

       它适合同時要傳多分相同的資料到叢集中不同的機器,同時資料的傳輸量雖然不大卻非常頻繁的情況.這種網絡I/O用這種方式性能能達到最高

1.引用自<深入分析java web技術内幕>

2.https://www.zhihu.com/question/19732473

此為讀書筆記,還望各位多多指導