同步 非同步 阻塞與非阻塞之間的關係

2021-10-07 02:44:34 字數 979 閱讀 3476

同步、非同步、阻塞與非阻塞可以組合成以下4種排列:

同步阻塞

同步非阻塞

非同步阻塞

非同步非阻塞

在使用普通的inputstream、outputstream 類時,就是屬於同步阻塞,因為執行當前讀寫任務一直是當前執行緒,並且讀不到或寫不出去就一直是阻塞的狀態。阻塞的意思就是方法.不返回,直到讀到資料或寫出資料為止。

nio技術屬於同步非阻塞。當執行「serversocketchannel.configureblocking(false)」**後,也是一直由當前的執行緒在執行讀寫操作,但是讀不到資料或資料寫不出去時讀寫方法就返回了,繼續執行讀或寫後面的**。

而非同步當然就是指多個執行緒間的通訊。例如,a執行緒發起乙個讀操作,這個讀操作要b執行緒進行實現,a執行緒和b執行緒就是非同步執行了。a執行緒還要繼續做其他的事情,這時b執行緒開始工作,如果讀不到資料,b執行緒就呈阻塞狀態了,如果讀到資料,就通知a執行緒,並且將拿到的資料交給a執行緒,這種情況是非同步阻塞。

最後一種是非同步非阻塞,是指a執行緒發起乙個讀操作,這個讀操作要b執行緒進行實現,因為a執行緒還要繼續做其他的事情,這時b執行緒開始工作,如果讀不到資料,b執行緒就繼續執行後面的**,直到讀到資料時,b執行緒就通知a執行緒,並且將拿到的資料交給a執行緒。

從大的概念上來講,同步和非同步關注的是訊息通訊機制,阻塞和非阻塞關注的是程式在等待呼叫結果時的狀態。檔案通道永遠都是阻塞的,不能設定成非阻塞模式。

首先乙個i/o操作其實分成了兩個步驟:

發起i/o請求;

實際的i/o操作。

同步i/o和非同步i/o的區別就在於第二個步驟是否阻塞。如果實際的i/o讀寫阻塞請求程序,那麼就是同步i/o。因此,阻塞i/o、非阻塞i/o、i/o 復用、訊號驅動i/o都是同步i/o。如果不阻塞,而是作業系統幫使用者做完i0操作再將結果返回給使用者,那麼就是非同步i/o。

阻塞i/o和非阻塞i/o的區別在於第一步,即發起i/o請求是否會被阻塞。如果阻塞直到完成,那麼就是傳統的阻塞i/o;如果不阻塞,那麼就是非阻塞i/o。

同步與非同步,阻塞與非阻塞的關係

這幾個知識點其實用處很多,也是很容易搞混的,我們平時可能用了但是並沒有發現,今天想來總結一下。我第一次感受到同步和非同步的不同是在學習volatile的時候 因為我之前也沒有多執行緒概念 之前也被同步啊這些概念搞的很亂。當我主線程新建了乙個子執行緒之後兩個執行緒是同時執行的,當時我才發現原來他們不是...

阻塞非阻塞與同步非同步

老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...

同步 非同步與阻塞 非阻塞

怎樣理解阻塞非阻塞與同步非同步的區別?嚴肅的回答 知乎 知乎這個問題下的各個回答,以及這篇blog已經講的很清楚了。也有提到同步阻塞,和非同步非阻塞是繫結的。但也有對同步非阻塞,和非同步非阻塞的模型的闡釋,特此記錄解釋。在這套解釋中,同步和非同步的語義不只是立即返回與否,還是獲取結果已完成的方式是通...