同步和異步,阻塞和非阻塞,到底區別在哪裏
時間 2021-07-13
標籤
同步
異步
阻塞
非阻塞
這個問題由來已久,翻過很多博客,看到過各種各樣的解釋。
但我知道你不喜歡看大段的文字,手癢畫了幾張圖,希望能給大家解惑。
同步和異步
稍微解釋下。。
我認爲,同步和異步的根本區別就是,目標方法是不是在當前線程上執行的。
- 同步:目標方法在當前線程上執行,會佔用當前線程的執行時間
- 異步,是把目標方法交給另一個線程去執行。最簡單的辦法就是new一個Thread去做這個事情了,或者不管什麼方式,只要通知到另外一個線程去做某件事,這就是異步了。
阻塞和非阻塞
這和同步異步完全不是一回事,描述的不是一個階段的東西。這兩個詞經常用來描述結果獲取。
- 阻塞:當前線程調用某個方法想做某件事,但是如果條件暫不滿足,可能會導致當前線程進入非Running狀態(比如Wait/Sleep/Park),直到發生了另外一件事情(比如超時,或者接到另一個線程的通知,或者獲得鎖),才能終止這種非運行狀態,完成想做的事情,這就是阻塞。
- 非阻塞:當前線程調用某個方法想做某件事,但是如果條件暫不滿足,方法會立即退出並」Say NO!」,表示無法完成,這就是非阻塞。有時候,當前線程會持續不斷地調用這個方法,直到最終成功。
其他
最近看到一篇博客,講的是計算機內核的各種I/O複用機制,很不錯,推薦給大家:
再談select, iocp, epoll,kqueue及各種I/O複用機制