1 走進並行世界

2022-03-10 02:12:01 字數 2595 閱讀 1470

同步方法呼叫一旦開始,呼叫者必須等到方法呼叫返回後,才繼續執行後續行為。

非同步方法一旦開始,方法呼叫會立即返回,呼叫者就可以繼續執行後續行為。而非同步方法通常會在另外乙個執行緒「真實」地執行,當這個非同步呼叫真實完成時,則會通知呼叫者。

併發偏重於多個任務交替執行,而多個任務之間有可能還是序列的。並行是真實意義上的「同時執行」。

臨界區用來表示一種公共資源或者說是共享資料,可以被多個執行緒使用。但是每一次,只能有乙個執行緒使用它,一旦臨界區資源被占用,其他執行緒要想使用這個資源,就必須等待。

阻塞和非阻塞通常用來形容多執行緒間的相互影響。比如乙個執行緒占用了臨界區資源,那麼其他需要這個資源的執行緒就必須在這個臨界區中等待。等待會導致執行緒掛起,這種情況就是阻塞。

非阻塞的意思與之相反,它強調沒有乙個執行緒可以妨礙其他執行緒執行。所有執行緒都會嘗試不斷前向執行。

死鎖、飢餓和活鎖都屬於多執行緒的活躍性問題。

死鎖:a、b、c、d四輛小車在這種情況下都無法繼續進行,它們彼此之間都占用了其他車輛的車道,如果大家都不願意釋放自己的車道,那麼這個狀態將永遠維持下去,誰都不可能通過。

飢餓:是指某乙個或者多個執行緒因為種種原因無法獲得所需要的資源,導致一直無法執行。

活鎖:如果兩個或兩個以上的執行緒都秉承著「謙讓」的原則,主動將資源釋放給他人使用,那麼就會出現資源不斷在兩個執行緒中跳動,而沒有乙個執行緒可以同時拿到所有資源而正常執行。這種情況就是活鎖。

根據控制併發的策略,我們可以把併發的級別進行分類,大致分為阻塞、無飢餓、無障礙、無鎖、無等待幾種。

乙個執行緒是阻塞的,那麼在其他執行緒釋放資源之前,當前執行緒無法繼續執行。

當我們使用synchronized重入鎖時,我們得到的就是阻塞的執行緒。

無論是synchronized或是重入鎖,都會試圖在執行後續**後,得到臨界區的鎖,如果得不到,執行緒就會被掛起。

如果執行緒間有優先順序,那麼執行緒排程優先滿足高優先順序的執行緒。對於非公平的鎖來說,系統允許高優先順序的執行緒插隊。這樣有可能導致低優先順序產生飢餓。

但是如果鎖時公平的,滿足先來後到,那麼飢餓就不會發生。所有執行緒都有機會執行。

無障礙是一種最弱的非阻塞排程。兩個執行緒如果是無障礙的執行,那麼他們不會因為臨界區的問題導致一方被掛起。換言之,大家都可以進入臨界區。

若大家一起修改共享資料,資料改壞了怎麼辦呢?對於無障礙的執行緒來說,一旦檢測到這種情況,它就會立即對自己所做的修改進行回滾,確保資料安全。

悲觀策略與樂觀策略:如果說阻塞的控制方式是悲觀策略(認為兩個執行緒發生衝突的可能性很大),那非阻塞的排程就是一種樂觀策略(認為兩個執行緒發生衝突的可能性很小,用,如遇衝突,用回滾的方式解決)。

這個策略可能出現在臨界區發生衝突時,所有執行緒可能都會不斷回滾自己的操作,而沒有乙個執行緒走出臨界區。

實現無障礙可以用乙個「一致性標記」來實現。

無鎖的並行都是無障礙的。在無鎖的情況下,所有執行緒都能嘗試對臨界區進行訪問,但不同的是,無鎖的併發保證必然有乙個執行緒能夠在有限步內完成操作離開臨界區

在無鎖的呼叫中,乙個典型特點是可能會包含乙個無窮迴圈。執行緒會不斷嘗試修改共享變數,無鎖的並行總是能保證乙個執行緒勝出。至於臨界區失敗的執行緒,它們會不斷重試,直到勝出。如果總是不成功,則可能出現類似飢餓的現象。

無鎖只要求有乙個執行緒可以在有限步內完成操作,而無等待則在無鎖的基礎上更進一步進行擴充套件。它要求所有執行緒都必須在有限步內完成,這樣就不會引起飢餓問題。

為什麼要使用並行程式?有兩個目的。第一, 為了獲得更好的效能;第二,由於業務模型的需要,確實需要多個實體。我們關注更多的是效能的問題。

加速比定義:加速比 = 優化前系統耗時 / 優化後系統耗時

加速比越高,說明優化效果越好。

jmm的關鍵技術點都是圍繞著多執行緒的原子性、可見性和有序性來建立的。因此,我們首先必須了解這些概念。

原子性是指乙個操作是不可中斷的。即使是多個執行緒一起執行,乙個操作一旦開始,就不會被其他執行緒干擾。

int是原子性的、long在32位系統來說,不是原子性的。

可見性是指當乙個執行緒修改了某乙個共享變數的值,其他執行緒是否能夠立即知道這個修改。這只能發生在並行中。

在併發時,程式的執行可能會出現亂序。給人直觀的感覺就是:寫在前面的**,會在後面執行。有序性問題的原因是因為程式在執行時,可能進行指令重排,重排後的指令與原指令的順序未必一致。

指令重排可以保證序列語義一致,但是沒有義務保證多執行緒間的語義也一致。

為什麼要指令重排呢?完全是為效能考慮的。具體的原因可以翻原書。

走進《開源世界》

資訊系統project 雜誌決定從今年第六期新增乙個欄目 開源世界 每期有固定的版面。那麼,開源世界 應該怎麼辦呢?資訊系統project 的英文刊名是 ccnews 定位於 chinacionews 這表明刊物的主要讀者群是 cio chiefinformationofficer 中文意思就是 首...

走進HTML的世界

html是用來描述網頁內容的一種語音。html用來描述網頁被稱之為html標籤。有如下標籤 2 html一般是成對出現,比如和 3 成對的標籤裡,第乙個 不帶 叫開始標籤,第二個叫結束標籤。4 有些標籤裡沒有結束標籤的,稱為 單標籤 一般寫法是開始標籤在關鍵字後跟上乙個,比如 在ht ml5的時代,...

大話儲存 1 走進計算機IO世界

組成計算機的三大件 cpu,記憶體和io。匯流排就是一條或者多條物理上的導線,每個部件都接到這些導線上,同一時刻只能有乙個部件在接收或者傳送。仲裁匯流排 所有部件按照另一條匯流排,也就是仲裁匯流排或者中斷匯流排上給出的訊號來判斷這個時刻匯流排可以由哪個部件來使用。產生仲裁匯流排或者中斷電位的可以是c...