摘要:無鎖無鎖的并行都是無障礙的,但不同的是無鎖的并發(fā)保證了必然有一個線程能夠在有限步驟內(nèi)離開臨界區(qū)。有關(guān)并行的兩個重要定律未完待續(xù)實戰(zhàn)高并發(fā)程序設(shè)計第一章走入并行世界讀書筆記歡迎加入咖啡館的春天。
必須知道的幾個概念 同步(Synchronous)和異步(Asynchronous)
同步方法調(diào)用一旦開始,調(diào)用者必須等待方法調(diào)用返回后才能繼續(xù)后續(xù)行為。異步方法調(diào)用更像一個消息傳遞,一旦開始就立即返回,調(diào)用者就可以繼續(xù)后續(xù)的操作。而被調(diào)用的異步方法會在另外一個線程里真實地執(zhí)行。如果異步調(diào)用需要返回結(jié)果,那么當(dāng)這個調(diào)用真實完成的時候,則會通知調(diào)用者。
并發(fā)(Concurrency)和并行(Parallelism)這兩個概念非常容易被混淆,它們都可以表示多個任務(wù)一起執(zhí)行,但并發(fā)偏重于多個任務(wù)交替執(zhí)行,而多個任務(wù)之間可能還是串行,讓外部的觀察者看起來像是并行;而并行是真正意義上的同時執(zhí)行。
實際上,如果系統(tǒng)內(nèi)只有一個單核 CPU,那么多線程或者多進程任務(wù)不可能是真實并行的,畢竟一個 CPU 一次只能執(zhí)行一條指令,這樣只能叫做并發(fā)而不是并行;真實的并行只可能出現(xiàn)在多個單核和/或者多核 CPU 中。
臨界區(qū)臨界區(qū)表示一種公共資源,可以被多個線程使用。但是每一次只能有一個線程使用它,一旦臨界區(qū)資源被占用,其他線程想要使用它就必須等待。
阻塞(Blocking)和非阻塞(Non-Blocking)通常用來形容多個線程之間的相互影響。比如一個線程占用了臨界區(qū)資源,那么其他所有需要這個資源的線程就必須等待,直到這個線程釋放了這個資源。這種情況就是阻塞;非阻塞代表沒有一個線程可以妨礙其他線程執(zhí)行,所有的現(xiàn)成都會嘗試不斷執(zhí)行下去。
死鎖(Deadlock)、饑餓(Starvation)和活鎖(Livelock)多個線程占有了其每個線程都需要的資源,你不讓我我不讓你,造成程序無法繼續(xù)執(zhí)行下去,這就是死鎖;饑餓是指某個或多個線程一直等不到所需的資源導(dǎo)致一直無法執(zhí)行,或者一個線程一直占有資源不釋放,其余線程一直在嘗試獲取這個資源;活鎖是指每個線程都主動地將資源釋放給別人用,那么就沒有任何一個線程能夠順利占有這個資源執(zhí)行。
并發(fā)級別 阻塞(Blocking)一個線程是阻塞的,那么在其他線程釋放之前,這個線程是無法執(zhí)行的。
無饑餓(Starvation-Free)如果鎖是公平的,不管新來的線程優(yōu)先級有多高,想要獲得資源,也必須排隊等待前面有可能優(yōu)先級比較低的先使用資源,這樣所有的線程都有機會執(zhí)行。
無障礙(Obstr-Free)多個進程可以一起進入臨界區(qū)獲取資源。為了避免在資源被多個線程修改導(dǎo)致一致性問題發(fā)生,其每個線程會在修改資源后進行回滾操作確保數(shù)據(jù)安全。但是依然會有一個問題就是資源修改的沖突特別大的時候,會導(dǎo)致每個線程一直在回滾,沒有一個線程能夠走出臨界區(qū)。
無鎖(Lock-Free)無鎖的并行都是無障礙的,但不同的是無鎖的并發(fā)保證了必然有一個線程能夠在有限步驟內(nèi)離開臨界區(qū)。
無等待(Wait-Free)無等待是要求所有的無障礙線程必須全部在有限步驟內(nèi)離開臨界區(qū),這樣就不會遇到饑餓問題。
有關(guān)并行的兩個重要定律(未完待續(xù))
實戰(zhàn) Java 高并發(fā)程序設(shè)計 第一章 走入并行世界 讀書筆記
歡迎加入咖啡館的春天(338147322)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70225.html
摘要:參考何去何從的并行計算忘記該死的并行并行程序的復(fù)雜性和亂序性,并行程序設(shè)計十分復(fù)雜。可怕的現(xiàn)實摩爾定律的失效單核上的晶體管數(shù)目達到極限。并發(fā)級別阻塞重入鎖無饑餓兩個線程優(yōu)先級不同,低優(yōu)先級的可能產(chǎn)生饑餓。 Chapter1 參考:https://github.com/chengbingh... 1.1何去何從的并行計算 1.1.1 忘記該死的并行并行程序的復(fù)雜性和亂序性,并行程序設(shè)計十...
摘要:在孫悟空的七十二變中,我覺得最厲害的是分身能力,這也是他百試不得其爽的終極大招,每每都能打得妖怪摸不著北。集群與分布式集群與分布式像一對孿生兄弟,傻傻分不清楚。所以,集群和分布式之間的關(guān)系是相互補充的。 本文首發(fā)于我的公眾號 cloud_dev,專注于干貨分享,號內(nèi)有大量書籍和視頻資源,后臺回復(fù)「1024」即可領(lǐng)取,歡迎大家關(guān)注,二維碼文末可以掃。 在孫悟空的七十二變中,我覺得最厲害的...
閱讀 3486·2021-11-12 10:36
閱讀 2857·2021-09-22 15:35
閱讀 2807·2021-09-04 16:41
閱讀 1164·2019-08-30 15:55
閱讀 3574·2019-08-29 18:43
閱讀 2070·2019-08-23 18:24
閱讀 1412·2019-08-23 18:10
閱讀 1922·2019-08-23 11:31