同步與異步&阻塞與非阻塞

一直爲同步異步,阻塞非阻塞概念所困擾,特定總結了下java

1、同步與異步的區別

一、概念介紹

  • 同步:所謂同步是一個服務的完成須要依賴其餘服務時,只有等待被依賴的服務完成後,依賴的服務才能算完成,這是一種可靠的服務序列。要麼成功都成功,失敗都失敗,服務的狀態能夠保持一致。微信

  • 異步:所謂異步是一個服務的完成須要依賴其餘服務時,只通知其餘依賴服務開始執行,而不須要等待被依賴的服務完成,此時該服務就算完成了。至於被依賴的服務最終是否真正完成,沒法肯定,因此它是不可靠的服務序列。異步

二、消息通知

  • 同步:當一個同步調用發出後,調用者要一直等待返回消息(或者調用結果)通知後,才能進行後續的執行;函數

  • 異步:當一個異步過程調用發出後,調用者不能馬上獲得返回消息(結果)。實際處理這個調用的部件在完成後,經過消息回調來通知調用者是否調用成功。.net

PS:調用者獲取依賴服務異步回調結果通常有兩種方式:
一種是主動去輪訓查詢異步回調的結果,
一種調用依賴服務時傳入一個callback方法或者回調地址,依賴服務完成以後去調用callback通知調用者。
通常狀況,這兩種方式都要支持纔是一種良好的異步回調設計方法。

三、場景比喻

小明去買奶茶,可能會有兩種方式線程

  • 小明點單交錢,而後等着取奶茶;
  • 小明點單交錢,而後奶茶妹給了小明一個小票,等小明的奶茶作好了,再告訴小明來取;
第一種方式就是同步,就等着奶茶妹作好奶茶,奶茶作好以後,小明拿到奶茶纔算完成整個任務

第二種方式就是異步,奶茶妹給了小明一個小票,小明就算完成了。至於最後奶茶作好沒有,反正奶茶妹會告訴小明的,那是後面的事情了。

四、總結

同步與異步着重點在消息通知的方式,也就是調用結果通知的方式。結合場景就是,拿到奶茶的方式。設計

2、阻塞與非阻塞的區別

一、概念介紹

  • 阻塞:阻塞調用是指調用結果返回以前,當前線程會被掛起,一直處於等待消息通知,不可以執行其餘業務。函數只有在獲得結果以後纔會返回。
阻塞調用和同步調用不一樣的。
對於同步調用來講,不少時候當前線程可能仍是激活的,只是從邏輯上當前函數沒有返回而已,此時,這個線程可能也會處理其餘的消息。

還有一點,在這裏先擴展下:
1.若是這個線程在等待當前函數返回時,仍在執行其餘消息處理,那這種狀況就叫作同步非阻塞;
2.若是這個線程在等待當前函數返回時,沒有執行其餘消息處理,而是處於掛起等待狀態,那這種狀況就叫作同步阻塞;

因此同步的實現方式會有兩種:同步阻塞、同步非阻塞;同理,異步也會有兩種實現:異步阻塞、異步非阻塞;
對於阻塞調用來講,則當前線程就會被掛起等待當前函數返回;
  • 非阻塞:非阻塞和阻塞的概念相對應,指在不能馬上獲得結果以前,該函數不會阻塞當前線程,而會馬上返回。
雖然表面上看非阻塞的方式能夠明顯的提升CPU的利用率,可是也帶了另一種後果就是系統的線程切換增長。
增長的CPU執行時間能不能補償系統的切換成本須要好好評估。

二、場景比喻

仍是小明去買奶茶,可能會有兩種方式code

  • 2.一、小明點單交錢,而後等着取奶茶;
一、小明在等着取奶茶的時候呢,啥都不幹,就等着;
小明等奶茶的行爲就叫作阻塞,小明在等奶茶的時候,阻塞了!而這種方式又叫作同步阻塞。

二、小明在等着取奶茶的時候呢,翻出手機,一會翻翻微信朋友圈,一會瞅瞅奶茶妹有沒有作好奶茶;
小明這種行爲就叫作非阻塞,由於沒有阻塞在等奶茶這件事情上。而這種方式又叫作同步非阻塞。
  • 2.二、小明點單交錢,而後奶茶妹給了小明一個小票,等小明的奶茶作好了,再告訴小明來取;
一、奶茶妹給了小明一個小票,而後小明仍是傻等着;
小明這種拿到票還傻等着的行爲,就叫阻塞。而這種行爲,又叫作異步阻塞!這種最傻了。

二、奶茶妹給了小明一個小票,而後小明翻出手機一直刷朋友圈,
過了一下子奶茶妹說小明你的奶茶好了,過來拿,小明才放下手機去拿奶茶。
這種方式就叫作非阻塞,又叫着異步非阻塞!

三、總結

阻塞與非阻塞的着重點在於當前線程等待消息返回的行爲。換成場景就是,小明等奶茶的行爲。blog

3、大總結

  • 一、同步阻塞:小明啥都不幹等奶茶。
  • 二、同步非阻塞:小明一邊玩手機一邊等奶茶。
  • 三、異步阻塞:小明拿着小票啥都不幹等着奶茶妹告訴他奶茶好了
  • 四、異步非阻塞:小明拿着小票玩着手機等着奶茶妹告訴他奶茶好了
相關文章
相關標籤/搜索