1. 程式人生 > >Java 同步與異步-阻塞與非阻塞理解

Java 同步與異步-阻塞與非阻塞理解

blog markdown logs 任務 一段 mar 慢操作 兩個 需要

Java 同步與異步-阻塞與非阻塞理解

Java 中同步與異步,阻塞與非阻塞都是用來形容交互方式,區別在於它們描述的是交互的兩個不同層面。

同步與異步

同步與異步更關註交互雙方是否可以同時工作。以同步的方式完成任務意味著多個任務的完成次序是串行的,假設任務 A 依賴於任務 B,那麽任務 A 必須等到任務 B 完成之後才能繼續,執行流程為 A->B;以異步的方式完成任務意味著多個任務的完成可以是並行的,這種情況多適用於任務之間沒有因果關系,假如任務 A 中需要執行任務 B,而任務 A 的完成不依賴於任務 B 的結果,那麽任務 A 調用任務 B 後可以繼續執行後續步驟而不需要等待任務 B 完成,也不關心任務 B 是否執行完畢,此時任務 A 和任務 B 是並行的。

為了加深對同步和異步的理解,可以使用打電話和發短信的類別同步和異步的交互方式。打電話時,一方的後續操作必須等到另一方說完才能進行,這種交互方式就是同步的。發短信則意味著我們不關心對方看到短信後的結果,我們關心自己是否發了短信,發完短信後,我們可以接著手頭上的工作,這種交互方式就是異步的。

阻塞與非阻塞

阻塞與非阻塞關註的是交互雙方是否可以彈性工作。假設對象 A 和對象 B 進行交互,而對象 B 對一個問題需要思考一段時間才能回復 A,那麽對象 A 可以選擇等待對象 B 回復,這種方式就是一種阻塞式交互,與此同時,對象 A 可以選擇在對象 B 進行思考的時間去完成別的工作,等到對象 B 完成思考後再進行後續交互,這種方式就是一種非阻塞式的交互。

一般來說,阻塞與非阻塞式用來形容 CPU 消耗的。我們把 CPU 停下來等待慢操作完成以後再接著工作稱為阻塞;把 CPU 在慢操作完成之前去完成其他工作,等慢操作完成後再接著工作稱為非阻塞。

Java 同步與異步-阻塞與非阻塞理解