同步異步是啥?打個比方:
定義:同步和異步關注的是消息通信機制 (synchronous communication/ asynchronous communication)。同步,就是調用某個東西是,調用方得等待這個調用返回結果才能繼續往后執行。異步,和同步相反 調用方不會理解得到結果,而是在調用發出后調用者可用繼續執行后續操作,被調用者通過狀體來通知調用者,或者通過回掉函數來處理這個調用
比方說:你去商城買東西,你看上了一款手機,能和店家說你一個這款手機,他就去倉庫拿貨,你得在店里等着,不能離開,這叫做同步。現在你買手機趕時髦直接去京東下單,下單完成后你就可用做其他時間(追劇、打王者、lol)等貨到了去簽收就ok了.這就叫異步。
更具體點拿我們的方法調用來舉例子:
- 同步方法調用一旦開始,調用者必須等到方法調用返回后,才能繼續后續的行為。
- 異步方法調用更像一個消息傳遞,一旦開始,方法調用就會立即返回,調用者就可以繼續后續的操作。而,異步方法通常會在另外一個線程中,“真實”地執行着。整個過程,不會阻礙調用者的工作
我加兩張圖讓你更好理解
同步執行
同步執行當調用方法執行完成后並返回結果,才能執行后續代碼
異步執行
異步調用的話可用參考ajax,調用方法后不會等到sum方法執行完成,而是直接執行后續代碼。sum方法執行完成后主要通過狀態通知主線程,或者通過回調處理這次異步方法執行的結果
同步異步於阻塞非阻塞不能混為一談
看了上面的講解,你可能會說這不就是阻塞機制嗎?不不不,同步異步不能和阻塞非阻塞混為一談。
阻塞和非阻塞 強調的是程序在等待調用結果(消息,返回值)時的狀態. 阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。 對於同步調用來說,很多時候當前線程還是激活的狀態,只是從邏輯上當前函數沒有返回而已,即同步等待時什么都不干,白白占用着資源。
同步和異步強調的是消息通信機制 (synchronous communication/ asynchronous communication)。所謂同步,就是在發出一個"調用"時,在沒有得到結果之前,該“調用”就不返回。但是一旦調用返回,就得到返回值了。換句話說,就是由“調用者”主動等待這個“調用”的結果。而異步則是相反,"調用"在發出之后,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個異步過程調用發出后,調用者不會立刻得到結果。而是在"調用"發出后,"被調用者"通過狀態、通知來通知調用者,或通過回調函數處理這個調用
參考博客:https://blog.csdn.net/huangqiang1363/article/details/79508852