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

2021-08-20 03:25:07 字數 2075 閱讀 2258

這幾個知識點其實用處很多,也是很容易搞混的,我們平時可能用了但是並沒有發現,今天想來總結一下。

我第一次感受到同步非同步的不同是在學習volatile的時候(因為我之前也沒有多執行緒概念),之前也被同步啊這些概念搞的很亂。當我主線程新建了乙個子執行緒之後兩個執行緒是同時執行的,當時我才發現原來他們不是序列的,獻醜了。好了進入正題。

從總體來看,同步和非同步的概念是大於阻塞與非阻塞,並且他們之間沒有對應關係。也就是說同步不一定是阻塞,非同步也不一定是非阻塞的。阻塞和非阻塞只是一種性質,而同步和非同步是從巨集觀上對一種任務性質的描述。

同步:如果有多個任務要發生,這些任務必須是挨個執行的,乙個子事件或子任務的執行或導致主事件流的暫停或等待,這些事件不能併發的執行。

非同步:多個任務或事件可以併發地執行,乙個事件或任務的執行不會導致整個流程的暫停或等待。

最直觀的來看:

void

function

()

那麼fun1()和fun2()就是序列執行,站在任務的角度我們可以說他們是同步的。(這裡大家可以想一下多執行緒同步是要幹什麼?結合關於臨界區的那個概念,我們的目的不就是要保證多個執行緒在訪問臨界區的時候要乙個乙個訪問嗎,要序列化,不能併發的訪問。其實這就是我們多執行緒要解決的核心問題)

void function()

}.start();

new thread()

}.start();

}

那麼此時fun1()和fun2()就是並行執行的,因為多執行緒的本質就是併發執行。而且我們也可以通過thread.join()方法來讓執行緒同步執行。

咱們再來點大白話的解釋,比如任務a中間有乙個子任務b,當執行b的時候a如果處於等待狀態,那麼就是同步的。如果a告訴b後,就由另乙個執行緒去執行b,到時候執行完了自動返回給a的話,那麼就是非同步的。

阻塞和非阻塞可以看做一種性質,既然是性質,那麼很多情況下都會存在。(可以多和io結合起來考慮)

阻塞:當某個事件或任務在執行過程中發出了乙個請求操作,但是由於該請求操作需要的條件不滿足,就會一直等在那,直到條件滿足。比如我們都用過的:inputstream.read()/socket.read()/object.wait()等等,如果請求的資源沒有準備好,那麼請求的執行緒就阻塞在那了,只有等接受到資料之後才繼續執行。

非阻塞:當某個事件或任務在執行過程中發出了乙個請求操作後,但是由於該請求操作需要的條件不滿足,那麼被請求端會發出乙個資訊,告訴請求資源的執行緒,我這邊資源沒準備好,你可以去做其他的。

所以,其實阻塞和非阻塞咱們可以理解為,a請求b之後,在b端資源沒準備好的時候,b是讓a一直等待還是發出乙個標誌。

一定記住,這兩組是完全不同的概念。同步不能和阻塞畫等號(只能說同步往往是阻塞的),是不是阻塞咱們可以通過判斷此刻主線程處於什麼狀態來判斷。比如:在nio中,我們有一種的多路復用模式。概念就是:我們不是採用乙個執行緒去負責乙個socket的方式,如果那樣一定是阻塞的。我們採用乙個執行緒管理多個socket的方式,該執行緒不斷輪詢所有socket,我們叫做selector,通過select()方法,我們可以找到某一時刻真正需要io資源的socket,避免資源浪費。那麼此時,我們的主線程是一直處於running狀態的,因為他在不斷輪詢,但它同時又是非阻塞的,因為沒有處於等待狀態嘛。

同時非同步也不一定是非阻塞的(只能說非同步常常是非阻塞的),例如我們往執行緒池裡面提交任務的時候,呼叫future.get()來試圖獲取處理結果時,由於結果還沒有執行出來,所以該方法會被阻塞。但是從多執行緒角度來看,此時它是非同步執行的。

再用大白話解釋一下,不敢保證一定準確無誤,同步和非同步我們描述的是多個執行緒之間的關係,而阻塞和非阻塞描述的是乙個執行緒的屬性。我們既然選擇了多執行緒也就選擇了非同步程式設計的方式,但是卻要解決同步的問題,而同步往往意味著效能的缺失和安全性的保障。而對於阻塞和非阻塞來說,傳統的方式大多是阻塞的,如果採用非同步非阻塞往往意味著更多的**和資源投入,很多時候需要工作者執行緒甚至jvm底層的幫助

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

同步 非同步 阻塞與非阻塞可以組合成以下4種排列 同步阻塞 同步非阻塞 非同步阻塞 非同步非阻塞 在使用普通的inputstream outputstream 類時,就是屬於同步阻塞,因為執行當前讀寫任務一直是當前執行緒,並且讀不到或寫不出去就一直是阻塞的狀態。阻塞的意思就是方法.不返回,直到讀到資...

同步與非同步 阻塞與非阻塞

設想一下這個情景,你列了個購物清單 a,b,c,d 去商店買東西,你向老闆詢店問有沒有你想要的a i o操作 於是老闆去倉庫檢視,這個時候假如你在前台等待老闆查詢結果回來那麼這種詢問等待的方式為同步,此時你相當於被掛起,是處於阻塞狀態的,而如果你沒有在前台等待老闆的查詢而是接著進店逛看有沒有你想要的...

同步與非同步,阻塞與非阻塞

同步與非同步阻塞與非阻塞 阻塞和非阻塞關注的是程式在等待呼叫結果 訊息,返回值 時的狀態.阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。還是上面的例子,你打 問書店老闆有沒有 分布式系統 這本書,...