快速瞭解《實戰Java高併發程序設計》的一些概念

同步與異步

同步(Synchronous):指調用者完成前一個方法才能繼續後面的行爲。(比如:實體店購物,看貨、選貨、付款、拿貨,得一個一個來)

異步(Asynchronous):指調用者調用一個方法後可以立刻返回往下執行,被調用的方法會由其他線程執行。(比如:網上購物,看完選好付款後,你愛幹嘛幹嘛,貨物會有人給你送來)


併發與並行

併發(Concurrency):指任務交替進行,看起來好像是同一時間一起執行的,但其實不是。

並行(Parallelism):指多個任務同時進行處理,是真正意義上的多線程,必須有多核CPU的支持。


臨界區

指共享資源,可以被多個線程使用(在這裏加鎖,就是爲了讓每次使用該資源的線程數量限制在一個)


死鎖、飢餓和活鎖

死鎖(Deadlock):多個程序彼此佔用了其他線程需要的資源,互不相讓,導致程序無法往下執行。

飢餓(Starvation):在區分優先級的條件下,高優先級的線程總是插隊低優先級的線程,導致低優先級的線程一直沒有機會得到資源,則稱之爲飢餓。

活鎖(Livelock):多個線程發現自己佔用了其他線程的資源,讓出了資源,恰好其他線程也一起讓出了資源,出現了一種尷尬的“你讓我,我讓你”的局面,就是活鎖。


併發級別

阻塞(Blocking):因synchronized關鍵字,重入鎖等原因,臨界資源區已經被佔用,除佔用外的其他線程需要使用這個資源而不得不掛起等待,則稱這種現象爲阻塞。

無飢餓(Starvation - Free):公平鎖(按先來先得的規則)不產生飢餓,非公平鎖(按高優先級優先的規則)則會產生飢餓。

以上兩種屬於阻塞式調度

無障礙(Obstruction - Free):是最弱的一種非阻塞調度,線程都可以進入臨界區,但是發現數據不一致則會使用回滾操作。

無鎖(Lock - Free):在無障礙的基礎上,設想總是會有一個線程能在有限步內完成操作離開資源區。

無等待(Wait - Free):所有線程,都必須在有限步內完成操作離開資源區。

以上三種屬於非阻塞式調度


阻塞式調度和非阻塞式調度

阻塞式調度:使用悲觀的策略,認爲衝突必定會發生,保護數據爲第一。

非阻塞式調度:使用樂觀的策略,認爲衝突很可能不會發生。


並行要解決的三個關鍵點

原子性(Atomicity):不可中斷的操作爲原子操作。(比如int的賦值就是原子操作,而long賦值不是,因爲在過程中可以被中斷,就有可能造成數據不一致的錯誤)

可見性(Visibility):其他線程能否知道某個線程是否修改了某一個變量。

有序性(Ordering):指令重排可能會打亂程序的執行順序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章