同步/非同步(描述網路通信模式,適用於請求 響應模型) 同步:發送方發送請求後,需要等待接收響應,結果占用並浪費了CPU資源 非同步:發送方發送請求後,不需要響應,可以繼續發送下一個請求,或者主動掛起線程並釋放CPU資源 阻塞/非阻塞(描述進程的函數方法調用方式) 阻塞:IO 調用會一直阻塞,直至調用結 ...
同步/非同步(描述網路通信模式,適用於請求-響應模型)
- 同步:發送方發送請求後,需要等待接收響應,結果占用並浪費了CPU資源
- 非同步:發送方發送請求後,不需要響應,可以繼續發送下一個請求,或者主動掛起線程並釋放CPU資源
阻塞/非阻塞(描述進程的函數方法調用方式)
- 阻塞:IO 調用會一直阻塞,直至調用結果返回後,才能繼續執行
- 非阻塞:IO 調用可以立即返回,並執行下一個 IO 調用
總結,同步非同步和阻塞非阻塞是兩個不同的概念,用最簡單的資料庫查詢來舉一個例子:
- 如果發送一個請求,需要等待資料庫響應,結果占用並浪費了CPU資源,這就是同步
- 如果發送一個請求,不需要資料庫響應,可以繼續處理另一個請求(NIO模式、回調通知模式),或者將任務插入一個隊列中,主動掛起自身線程並釋放CPU資源(非同步隊列模式),這就是非同步
- 在第2點中,如果採用非同步隊列模式,會造成線程阻塞,直至獲得資料庫數據後,才能繼續執行,這就是阻塞
- 在第2點中,如果採用NIO模式、回調通知模式,則意味著資料庫IO調用可以立即返回,這就是非阻塞
一般來說,同步是最簡單的編程方式,而非同步編程雖然需要一定的技術和工作量,但是卻能提升系統性能。對於阻塞與非阻塞,阻塞方式的實時響應性更好,但是掛起與喚醒線程的性能損耗更高,而非阻塞方式的性能、吞吐量更高,但是由於其是順序執行每一個事件,一旦處理某一個事件過久,會直接影響後續事件的處理,因此實時響應性比較差。