同步和異步,阻塞和非阻塞,到底區別在哪裏

這個問題由來已久,翻過很多博客,看到過各種各樣的解釋。

但我知道你不喜歡看大段的文字,手癢畫了幾張圖,希望能給大家解惑。

同步和異步

同步和異步

稍微解釋下。。
我認爲,同步和異步的根本區別就是,目標方法是不是在當前線程上執行的。

  1. 同步:目標方法在當前線程上執行,會佔用當前線程的執行時間
  2. 異步,是把目標方法交給另一個線程去執行。最簡單的辦法就是new一個Thread去做這個事情了,或者不管什麼方式,只要通知到另外一個線程去做某件事,這就是異步了。

阻塞和非阻塞

這和同步異步完全不是一回事,描述的不是一個階段的東西。這兩個詞經常用來描述結果獲取。

這裏寫圖片描述

  1. 阻塞:當前線程調用某個方法想做某件事,但是如果條件暫不滿足,可能會導致當前線程進入非Running狀態(比如Wait/Sleep/Park),直到發生了另外一件事情(比如超時,或者接到另一個線程的通知,或者獲得鎖),才能終止這種非運行狀態,完成想做的事情,這就是阻塞。
  2. 非阻塞:當前線程調用某個方法想做某件事,但是如果條件暫不滿足,方法會立即退出並」Say NO!」,表示無法完成,這就是非阻塞。有時候,當前線程會持續不斷地調用這個方法,直到最終成功。

其他

最近看到一篇博客,講的是計算機內核的各種I/O複用機制,很不錯,推薦給大家:
再談select, iocp, epoll,kqueue及各種I/O複用機制