1. 程式人生 > >Java 同步/非同步IO,阻塞/非阻塞IO

Java 同步/非同步IO,阻塞/非阻塞IO

對於IO,有同步,非同步,阻塞,非阻塞的分類,最近才稍微對這些分類有一些理解,下面記錄一下:

首先,我們需要劃分IO,我們對IO操作分為兩個步驟,1:程式發出IO請求,2:完成實際IO操作,阻塞、非阻塞是針對第一步劃分的,而同步、非同步是針對第二部劃分的。

阻塞/非阻塞:首先,我覺得應該理解一下什麼叫阻塞。一個IO請求,線上程中進行,當這個IO請求沒有資料或者沒有有效資料拉來完成IO操作,那麼這個請求不會結束,而是等待,而這個等待就是阻塞,因為他在等待資料,導致其他IO操作無法進行,就像一個前列腺的男子等著pee,從而使整個廁所阻塞。但是怎麼解決這個事情呢,java中NIO庫用來解決這個問題,通過buffer,channel,selector使IO請求迅速獲得是否可以進行實際操作的資訊,無論可不可以,如果資料沒有準備好,那麼就返回資訊沒有準備好。然後進行別的io操作。

同步/非同步:上面說到過,同步/非同步IO的區分是針對完成實際的IO操作,籠統的說,同步IO就是應用程式完成實際的IO操作,而非同步IO就是將實際的IO操作交給作業系統去完成,這麼說,我自己都很難理解,應用程式完成和作業系統完成有什麼區別呢?首先說同步,如果是應用程式本身去完成這個IO操作,那麼這個應用程式這個程序就會被阻塞,這裡的阻塞和上面的阻塞不同,上面的阻塞和非阻塞IO其實都屬於同步IO,因為無論他們在請求時是否阻塞執行緒,他們的IO操作都是由應用程式進行的.而非同步IO就不同了,它將實際IO操作交給作業系統去完成,首先應用程式本身的程序就沒有阻塞,其次作業系統能利用的程序很多,等實際IO操作完成之後,通知程式一聲就可以了,這樣效能就會高於同步IO.

我覺的理解這四個分類首先就要理解IO操作的兩個步驟,否則你會認為阻塞/非阻塞/同步/非同步 是四個沒有交集的分類,但其實同步IO包括了阻塞和非阻塞IO,

我的理解暫時就是這樣,如果有了新的理解,再來修改