同步(Synchronous)和異步(Asynchronous)
同步方法調(diào)用一旦開始,調(diào)用者必須等待方法調(diào)用返回后才能繼續(xù)后續(xù)行為涤久。異步方法調(diào)用更像一個(gè)消息傳遞涡尘,一旦開始就立即返回,調(diào)用者就可以繼續(xù)后續(xù)的操作响迂。而被調(diào)用的異步方法會(huì)在另外一個(gè)線程里真實(shí)地執(zhí)行考抄。如果異步調(diào)用需要返回結(jié)果,那么當(dāng)這個(gè)調(diào)用真實(shí)完成的時(shí)候蔗彤,則會(huì)通知調(diào)用者川梅。
并發(fā)(Concurrency)和并行(Parallelism)
這兩個(gè)概念非常容易被混淆,它們都可以表示多個(gè)任務(wù)一起執(zhí)行然遏,但并發(fā)偏重于多個(gè)任務(wù)交替執(zhí)行贫途,而多個(gè)任務(wù)之間可能還是串行,讓外部的觀察者看起來像是并行待侵;而并行是真正意義上的同時(shí)執(zhí)行丢早。
實(shí)際上,如果系統(tǒng)內(nèi)只有一個(gè)單核 CPU秧倾,那么多線程或者多進(jìn)程任務(wù)不可能是真實(shí)并行的怨酝,畢竟一個(gè) CPU 一次只能執(zhí)行一條指令,這樣只能叫做并發(fā)而不是并行那先;真實(shí)的并行只可能出現(xiàn)在多個(gè)單核和/或者多核 CPU 中农猬。
臨界區(qū)
臨界區(qū)表示一種公共資源,可以被多個(gè)線程使用售淡。但是每一次只能有一個(gè)線程使用它斤葱,一旦臨界區(qū)資源被占用慷垮,其他線程想要使用它就必須等待。
阻塞(Blocking)和非阻塞(Non-Blocking)
通常用來形容多個(gè)線程之間的相互影響揍堕。比如一個(gè)線程占用了臨界區(qū)資源料身,那么其他所有需要這個(gè)資源的線程就必須等待,直到這個(gè)線程釋放了這個(gè)資源鹤啡。這種情況就是阻塞惯驼;非阻塞代表沒有一個(gè)線程可以妨礙其他線程執(zhí)行,所有的現(xiàn)成都會(huì)嘗試不斷執(zhí)行下去递瑰。
死鎖(Deadlock)祟牲、饑餓(Starvation)和活鎖(Livelock)
多個(gè)線程占有了其每個(gè)線程都需要的資源,你不讓我我不讓你抖部,造成程序無法繼續(xù)執(zhí)行下去说贝,這就是死鎖;饑餓是指某個(gè)或多個(gè)線程一直等不到所需的資源導(dǎo)致一直無法執(zhí)行慎颗,或者一個(gè)線程一直占有資源不釋放乡恕,其余線程一直在嘗試獲取這個(gè)資源;活鎖是指每個(gè)線程都主動(dòng)地將資源釋放給別人用俯萎,那么就沒有任何一個(gè)線程能夠順利占有這個(gè)資源執(zhí)行傲宜。
并發(fā)級(jí)別
阻塞(Blocking)
一個(gè)線程是阻塞的,那么在其他線程釋放之前夫啊,這個(gè)線程是無法執(zhí)行的函卒。無饑餓(Starvation-Free)
如果鎖是公平的,不管新來的線程優(yōu)先級(jí)有多高撇眯,想要獲得資源报嵌,也必須排隊(duì)等待前面有可能優(yōu)先級(jí)比較低的先使用資源,這樣所有的線程都有機(jī)會(huì)執(zhí)行熊榛。無障礙(Obstr-Free)
多個(gè)進(jìn)程可以一起進(jìn)入臨界區(qū)獲取資源锚国。為了避免在資源被多個(gè)線程修改導(dǎo)致一致性問題發(fā)生,其每個(gè)線程會(huì)在修改資源后進(jìn)行回滾操作確保數(shù)據(jù)安全玄坦。但是依然會(huì)有一個(gè)問題就是資源修改的沖突特別大的時(shí)候血筑,會(huì)導(dǎo)致每個(gè)線程一直在回滾,沒有一個(gè)線程能夠走出臨界區(qū)营搅。無鎖(Lock-Free)
無鎖的并行都是無障礙的云挟,但不同的是無鎖的并發(fā)保證了必然有一個(gè)線程能夠在有限步驟內(nèi)離開臨界區(qū)。無等待(Wait-Free)
無等待是要求所有的無障礙線程必須全部在有限步驟內(nèi)離開臨界區(qū)转质,這樣就不會(huì)遇到饑餓問題。