-
1 # 此生唯一
-
2 # 遷徙de麻雀
因為你已經會使用多執行緒了,如果是要熟悉多執行緒程式設計,你可以檢查你是否熟悉這幾點:
檢查表1、執行緒的記憶體(核心態和使用者態)消耗,這個對於你使用的語言是否有虛擬機器執行時是不一樣的。同時需要了解程序的記憶體佈局。
2、執行緒的排程/切換代價、系統呼叫機制的實現。
3、執行緒池的設計(是真的設計)和使用。
4、多執行緒的同步策略,多種級別鎖的實現和效能評估,死鎖問題。輕量鎖或無鎖模式的實現。熟悉常用三方元件提供的介面中的原子操作,自定義分散式鎖的實現。
5、熟悉非同步IO、IO複用的詳細機制和使用。我們平時碰到的大部分應用都是IO密集型的,多執行緒此時和IO是密不可分的。
6、識別多執行緒環境(包括隱蔽的多程序協作),能對多執行緒環境出現的同步和效能問題做出分析和給出解決方案。
語言平臺如果你需要做基於客戶端的程式設計,需要了解應用程式模型關於UI執行緒的設計。
同時基於你使用的語言平臺,你還需要了解相關的基於並行任務程式設計以及語言本身提供的執行緒和同步介面,async/await程式設計模式,並行庫使用等。
我覺得僅僅是熟悉多執行緒程式設計,以上應該就差不多了。另外,不同公司在招聘要求中的描述的“熟悉”可能內涵不太一樣,不過你如果上面的檢查表過關了,相信大部分公司都能過這一關。
-
3 # 日衝資訊 黃
多執行緒程式設計的難度是很大的。這是由於多執行緒程式的問題無法用測試進行檢驗。唯一的辦法是透過邏輯評審。這裡我來分享一下評審多執行緒程式時使用的思路。
互動邏輯先說說理論。多執行緒程式評審有兩個指標:
安全性 共有資源在任何時刻最多隻有一個執行緒使用。生存性 所有執行緒最終都能佔有共有資源,沒有死鎖。這裡所說的共有資源可以是變數,也可以是一段程式碼。為了說明執行緒控制的基本原則,本文的例子沒有使用程式語言中的多執行緒控制指令。現在舉例,有很多執行緒每個執行緒中都有一個數,你想計算出這些數的合計。用偽程式碼表示:
number =from_thread;summary+=number;這裡共有資源有兩個number和summary,我們假定有兩個執行緒,一個在執行第1行,另一個在執行第2行,由於沒有任何限制,這種情況有可能發生,執行緒不安全。後果是可能漏掉一些數。為了確保安全,考慮建立一個標示,如果標示為零就把標示加一併執行累計,否則,就等待到標示為零。累計完畢後將標示設為零。虛擬碼:
while(flag!=0){wait();};flag++;number =from_thread;summary+=number;flag=0;檢驗安全性,假定有兩個執行緒,一個在執行第2行,另一個在執行第3行,我們發現只有flag為零第二個執行緒才能執行第二行。第一個執行緒在第三行的時候,flag必不為零。執行緒是安全的。
接下來檢驗生存性,假定有執行緒在第1行等待,而flag為零,這個情況不會出現。因此,可生存。
5個哲學家就餐這是一個十分經典的多執行緒問題,這個問題網上有很多雷同的答案,大部分都是錯的。當年這個問題也曾困擾微軟的工程師,他們使用了隨機的GUID解決了。但理論上說這個方法並不完美,如果出現了相同的GUID執行緒就不安全了。雖然機率微乎其微,但畢竟不是零。而Linux也找到了徹底的解法,完美地保證了執行緒安全。這個問題說來話長。限於篇幅,就說這麼多吧,如有疑問還請包涵。
生活中的例子互動邏輯並不只存在在程式設計領域,它和我們的生活息息相關。舉個例子,法律規定遺產繼承要由直系親屬平均分配。其實,這是不安全的。我們用這樣一個家庭進行分析,父母夫妻子共五個人,夫與子出去旅行遭遇空難雙雙死亡。由於無法弄清楚夫與子的死亡順序(兩個執行緒),夫的遺產(共有資源)繼承上出現了糾紛,若夫先亡,剩下4人每人繼承1/4,子再亡,妻可再繼承子的1/4.共計1/2財產。若子先亡,無財產繼承,夫再亡,剩下三人每人1/3。
本人待畢業生一名,看到很多招聘資訊中都要求:熟悉多執行緒程式設計(或併發程式設計/非同步程式設計)。我在自己寫爬蟲的時候為了提高效率用過多執行緒。但是不是很理解招聘資訊中所指的熟悉多執行緒程式設計是指會使用多執行緒嗎?
回覆列表
從事JAVA開發多年,見證了多執行緒作為考驗一個人程式設計能力的重要指標,是如何難到眾多英雄好漢的!
為什麼多執行緒難以掌握?因為多執行緒涉及到底層資料處理,同時概念抽象,模型複雜,出現問題難以復現等特性!
先來看下為什麼要使用多執行緒?我們都知道,單核CPU同一時間只能計算一個執行緒的資料,而在傳統的網路程式設計或者io很容易受到網路延遲,卡頓等影響導致執行緒處於阻塞狀態,這個時候的CPU也處於停滯狀態,影響了計算效能的提高!所以引入了多執行緒技術。。。
單核多執行緒:在單核CPU中,我們可以在一個執行緒阻塞的同時,新啟一個執行緒進行處理,等到這個執行緒處理完的時候再喚醒其他執行緒!
多核多執行緒:多核之間,執行緒並行處理,單核之內使用上面的模型進行處理!
怎麼樣算是熟悉多執行緒呢?光是上面的概念可不夠!
1,先解決效能:多執行緒最根本的需求還是充分"壓榨"CPU資源進行計算,使用多執行緒避免阻塞,平行計算等是最起碼要會做的,
①,使用繼承Thread和實現Runnable方式實現多執行緒,掌握執行緒狀態,喚醒,休眠等方法處理!
②,使用執行緒池,防止執行緒頻繁建立和釋放的資源開銷!
④,使用ThreadLocal本地變數避免執行緒間變數汙染!
⑤,使用future和callable實現執行緒完成回撥!
⑥,會編寫master-workers模型,即一個主執行緒處理連線,接收任務等,分發給多個執行執行緒進行處理,這是一個比較高效和經典的模型,值得研究!reactor和netty基於這種模型!
2,再處理安全:多執行緒因為不可控性,容易引發資料安全問題
①,使用各種鎖,保證資料安全!包括synchonize,readwriterlock(讀鎖共享,寫鎖獨佔),等!
②,使用執行緒方法實現,執行緒的順序執行!
④,防止死鎖:順序性的佔有鎖等,避免死鎖!
⑤,使用執行緒安全的類,concureentMap,hashtable!
⑥,學會樂觀鎖和悲觀鎖程式設計(之前的文章中有提到過)!
最後,像cyclicBarrier,CountdownLatch的也經常用做倒計數程式設計等,需要掌握!