為什麼要使用併發程式設計?
提公升多核cpu的利用率:一般來說一台主機上的會有多個cpu核心,我們可以建立多個執行緒,理論上講作業系統可以將多個執行緒分配給不同的cpu去執行,每個cpu執行乙個執行緒,這樣就提高了cpu的使用效率,如果使用單執行緒就只能有乙個cpu核心被使用。
簡單來說就是:充分利用cpu的計算能力,將業務拆分,提高效率。
凡事都有兩面性:多執行緒好處與壞處。
多執行緒的缺點:
併發程式設計的目的就是為了能提高程式的執行效率,提高程式執行速度,但是併發程式設計並不總是能提高程式執行速度的,而且併發程式設計可能會遇到很多問題,比如:記憶體洩漏、上下文切換、執行緒安全、死鎖等問題。
執行緒也是程式,所以執行緒需要占用記憶體,執行緒越多占用記憶體也越多;
多執行緒需要協調和管理,所以需要 cpu 時間跟蹤執行緒;
執行緒之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題。
這裡就涉及到了鎖啊,執行緒啊,怎麼保證多執行緒的執行安全,併發程式設計三個必要因素是什麼。
併發程式設計三要素
三要素
原子性:原子,即乙個不可再被分割的顆粒。原子性指的是乙個或多個操作要麼全部執行成功要麼全部執行失敗。
可見性:乙個執行緒對共享變數的修改,另乙個執行緒能夠立刻看到。(synchronized,volatile)
有序性:程式執行的順序按照**的先後順序執行。(處理器可能會對指令進行重排序)
執行緒的建立
最開始的方法:繼承 thread 類
public class mythread extends thread
public void run()
實現 runnable 介面
public class myrunnable implements runnable
public void run()
實現 callable 介面
public class mycallable implements callablepublic integer call()
使用匿名內部類方式
在類的裡面使用thread類建立乙個出來。
然後說下runnable 和 callable 有什麼區別:
上面可以砍出來都是介面
都可以編寫多執行緒程式
都採用thread.start()啟動執行緒的。
主要區別:
runnable 介面 run 方法無返回值;callable 介面 call 方法有返回值,是個泛型,和future、futuretask配合可以用來獲取非同步執行的結果。
runnable 介面 run 方法只能丟擲執行時異常,且無法捕獲處理;callable 介面 call 方法允許丟擲異常,可以獲取異常資訊
注:callalbe介面支援返回執行結果,需要呼叫futuretask.get()得到,此方法會阻塞主程序的繼續往下執行,如果不呼叫不會阻塞。
執行緒的安全與死鎖
出現執行緒安全問題的原因一般都是三個原因:
1)執行緒切換帶來的原子性問題
解決辦法:使用多執行緒之間同步synchronized或使用鎖(lock)。
2)快取導致的可見性問題
解決辦法:synchronized、volatile、lock,可以解決可見性問題
3)編譯優化帶來的有序性問題
執行緒死鎖:
形成死鎖的四個必要條件
1)互斥條件:在一段時間內某資源只由乙個程序占用。如果此時還有其它程序請求資源,就只能等待,直至占有資源的程序用畢釋放。
2)占有且等待條件:指程序已經保持至少乙個資源,但又提出了新的資源請求,而該資源已被其它程序占有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。
3)不可搶占條件:別人已經占有了某項資源,你不能因為自己也需要該資源,就去把別人的資源搶過來。
4)迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。(比如乙個程序集合,a在等b,b在等c,c在等a)
什麼是死鎖
1)死鎖是指兩個或兩個以上的程序(執行緒)在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序(執行緒)稱為死鎖程序(執行緒)。
2)多個執行緒同時被阻塞,它們中的乙個或者全部都在等待某個資源被釋放。由於執行緒被無限期地阻塞,因此程式不可能正常終止。
怎麼解決死鎖
1)避免乙個執行緒同時獲得多個鎖。
2)避免乙個執行緒在鎖內同時占用多個資源,盡量保證每個鎖只占用乙個資源。
3)嘗試使用定時鎖,使用lock.trylock(timeout)來替代使用內部鎖機制。
併發程式設計的那些事。(二)
1 並行 同一時間點,多件事情同時發生。相當於多車道 同時跑4輛車 併發 同一時間間隔,多件事情有序的發生。相當於單車道 依次跑了4輛車 同步 第二個程序的執行需要依賴第乙個程序的結果,只有第乙個程序執行完畢,第二個程序才會執行,這叫同步。非同步 程序之間相互獨立,在執行程序1 的時候 可以同時執行...
面試的那些事
這是面試過別人的一些總結 一 第一次面試 面試人員 大齡程式設計師,技術能力差 net 對於.net理解不夠深刻 asp.net內建物件不知為何物 二 第二次面試 面試人員 應屆畢業生,地理資訊系統專業,缺乏自信,坐姿不整 彎腰 三 第三次面試 面試人員 畢業兩年,但是對於大學學的東西,完全忘記 工...
面試的那些事 1
前幾日面試一家公司問到海量資料的問題.自己當時可能沒有理解出什麼意思,回答得不盡如意 上網查了查資料,發覺網上的答案眾多,有點籠統.現總結一下.1.建立相關聚合索引 查詢欄位用得較多 2.在資料庫上面x表的某時間欄位上進行分檔案,分割槽,優化資料庫結構 3.至少也得具備常識性的資料庫知道,如char...