一直爲同步異步,阻塞非阻塞概念所困擾,特定總結了下java
同步:所謂同步是一個服務的完成須要依賴其餘服務時,只有等待被依賴的服務完成後,依賴的服務才能算完成,這是一種可靠的服務序列。要麼成功都成功,失敗都失敗,服務的狀態能夠保持一致。微信
異步:所謂異步是一個服務的完成須要依賴其餘服務時,只通知其餘依賴服務開始執行,而不須要等待被依賴的服務完成,此時該服務就算完成了。至於被依賴的服務最終是否真正完成,沒法肯定,因此它是不可靠的服務序列。異步
同步:當一個同步調用發出後,調用者要一直等待返回消息(或者調用結果)通知後,才能進行後續的執行;函數
異步:當一個異步過程調用發出後,調用者不能馬上獲得返回消息(結果)。實際處理這個調用的部件在完成後,經過消息回調來通知調用者是否調用成功。.net
PS:調用者獲取依賴服務異步回調結果通常有兩種方式: 一種是主動去輪訓查詢異步回調的結果, 一種調用依賴服務時傳入一個callback方法或者回調地址,依賴服務完成以後去調用callback通知調用者。 通常狀況,這兩種方式都要支持纔是一種良好的異步回調設計方法。
小明去買奶茶,可能會有兩種方式線程
第一種方式就是同步,就等着奶茶妹作好奶茶,奶茶作好以後,小明拿到奶茶纔算完成整個任務 第二種方式就是異步,奶茶妹給了小明一個小票,小明就算完成了。至於最後奶茶作好沒有,反正奶茶妹會告訴小明的,那是後面的事情了。
同步與異步着重點在消息通知的方式,也就是調用結果通知的方式。結合場景就是,拿到奶茶的方式。設計
阻塞調用和同步調用不一樣的。 對於同步調用來講,不少時候當前線程可能仍是激活的,只是從邏輯上當前函數沒有返回而已,此時,這個線程可能也會處理其餘的消息。 還有一點,在這裏先擴展下: 1.若是這個線程在等待當前函數返回時,仍在執行其餘消息處理,那這種狀況就叫作同步非阻塞; 2.若是這個線程在等待當前函數返回時,沒有執行其餘消息處理,而是處於掛起等待狀態,那這種狀況就叫作同步阻塞; 因此同步的實現方式會有兩種:同步阻塞、同步非阻塞;同理,異步也會有兩種實現:異步阻塞、異步非阻塞; 對於阻塞調用來講,則當前線程就會被掛起等待當前函數返回;
雖然表面上看非阻塞的方式能夠明顯的提升CPU的利用率,可是也帶了另一種後果就是系統的線程切換增長。 增長的CPU執行時間能不能補償系統的切換成本須要好好評估。
仍是小明去買奶茶,可能會有兩種方式code
一、小明在等着取奶茶的時候呢,啥都不幹,就等着; 小明等奶茶的行爲就叫作阻塞,小明在等奶茶的時候,阻塞了!而這種方式又叫作同步阻塞。 二、小明在等着取奶茶的時候呢,翻出手機,一會翻翻微信朋友圈,一會瞅瞅奶茶妹有沒有作好奶茶; 小明這種行爲就叫作非阻塞,由於沒有阻塞在等奶茶這件事情上。而這種方式又叫作同步非阻塞。
一、奶茶妹給了小明一個小票,而後小明仍是傻等着; 小明這種拿到票還傻等着的行爲,就叫阻塞。而這種行爲,又叫作異步阻塞!這種最傻了。 二、奶茶妹給了小明一個小票,而後小明翻出手機一直刷朋友圈, 過了一下子奶茶妹說小明你的奶茶好了,過來拿,小明才放下手機去拿奶茶。 這種方式就叫作非阻塞,又叫着異步非阻塞!
阻塞與非阻塞的着重點在於當前線程等待消息返回的行爲。換成場景就是,小明等奶茶的行爲。blog