同步/異步(描述網絡通信模式,適用於請求-響應模型)
- 同步:發送方發送請求后,需要等待接收響應,否則將一直等待
- 異步:發送方發送請求后,不需要等待響應,可以繼續發送下一個請求,或者主動掛起線程並釋放CPU
阻塞/非阻塞(描述進程的函數調用方式)
- 阻塞:IO 調用會一直阻塞,直至結果返回才能繼續執行
- 非阻塞:IO 調用會立即返回,不需要等待結果,並可以執行下一個 IO 調用
總結,同步異步和阻塞非阻塞是兩個不同的概念,用簡單的數據庫查詢來舉一個例子:
- 如果發送一個請求,需要等待數據庫響應,否則將一直等待,這就是同步
- 如果發送一個請求,不需要數據庫響應,就可以繼續發送下一個請求(NIO模式、回調通知模式),或者主動將任務插入隊列中,主動掛起線程並釋放CPU(異步隊列模式),這就是異步
- 在第2點中,如果采用異步隊列模式,會造成線程阻塞或超時等待,直至結果返回后才能繼續執行,這就是異步阻塞
- 在第2點中,如果采用NIO模式、回調通知模式,則數據庫IO調用可以立即返回,這就是異步非阻塞
一般來說,同步是最簡單的編程方式,而異步編程雖然需要一定技術,但是卻能提升系統性能。對於阻塞與非阻塞,阻塞的實時響應性更好,但在高並發情況下阻塞線程數會急劇增加,導致大量的上下文切換會引起掛起/喚醒線程的性能損耗,而非阻塞的性能吞吐量更高,但由於其是順序執行每一個事件,一旦處理某一個事件過久,會影響后續事件的處理,因此實時響應性較差。