Java併發程式設計之概念五 阻塞和非阻塞

2021-09-11 17:58:31 字數 1404 閱讀 9612

概念描述

阻塞和非阻塞通常被用來形容多執行緒間的相互影響。

解釋:當乙個執行緒占用了臨界區資源,那麼其它需要使用這個資源的執行緒都必須在這個臨界區上等待。等待會導致執行緒掛起,這樣就形成了阻塞。如果占用資源的執行緒一直沒有釋放資源,那麼其它的執行緒在這個臨界區上都不能繼續工作。

相反,非阻塞表明多個執行緒之間的執行是不會相互影響的。 

阻塞呼叫

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起,一直處於等待訊息通知,不能夠執行其他業務。函式只有在得到結果之後才會返回。

阻塞呼叫和同步呼叫不同點:

對於同步呼叫來說,很多時候當前執行緒可能還是啟用的,只是從邏輯上當前函式沒有返回而已,此時,這個執行緒可能也會處理其他的訊息。

擴充套件:

a.如果這個執行緒在等待當前函式返回時,仍在執行其他訊息處理,那這種情況就叫做同步非阻塞

b.如果這個執行緒在等待當前函式返回時,沒有執行其他訊息處理,而是處於掛起等待狀態,那這種情況就叫做同步阻塞

所以同步的實現方式會有兩種:同步阻塞、同步非阻塞;同理,非同步也會有兩種實現:非同步阻塞、非同步非阻塞。

範例

老張愛喝茶,廢話不說,煮開水。

出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。

1 老張把水壺放到火上,立等水開。(同步阻塞)

老張覺得自己有點傻

2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)

老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀~~~~的噪音。

3 老張把響水壺放到火上,立等水開。(非同步阻塞)

老張覺得這樣傻等意義不大

4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(非同步非阻塞)

老張覺得自己聰明了

同步就是燒開水,通過「要自己來看開沒開」這種形式通知你水開了;非同步就是水開了,通過「水壺響了」這種方式通知你水開了。

阻塞就是燒開水的過程中,你一直盯著水開沒開,不能幹其他事情了(即你被阻塞住了);非阻塞是燒開水的過程裡可以幹其他事情(看電視)。

同步與非同步說的是你獲得水開了的方式不同。阻塞與非阻塞說的是你得到結果之前能不能幹其他事情。兩組概念描述的是不同的內容。

Java併發程式設計之阻塞佇列與Fork Join框架

阻塞佇列是支援兩個附加操作的佇列。這兩個附加操作支援阻塞插入和移除方法 阻塞佇列通常用於生產者 消費者場景。生產者是向佇列新增元素的執行緒,使用者是將元素從佇列中取出的執行緒,阻塞佇列是儲存和檢索元素的容器。阻塞佇列的4種處理方式 丟擲異常 返回特殊值 一直阻塞 超時退出 arrayblocking...

實戰Java高併發程式設計之概念

學習高併發你必須知道的幾個重要的概念 1.同步 synchronous 和非同步 asynchronous 同步和非同步是對方法的呼叫而言的 同步呼叫時,會等待呼叫的方法完成以後才能繼續執行這個方法。非同步呼叫的時候會瞬間的返回,但是並不是表示這個請求已經完成了,但是會在後台起乙個執行緒去執行接下來...

java併發程式設計之Exchanger

exchanger v 可以交換的物件型別 可以在對中對元素進行配對和交換的執行緒的同步點。每個執行緒將條目上的某個方法呈現給 exchange 方法,與夥伴執行緒進行匹配,並且在返回時接收其夥伴的物件。exchanger 可能被視為 synchronousqueue 的雙向形式。exchanger...