一、前言
1、為什麼需要並行?
-業務需求(業務上需要乙個邏輯單元,多個執行緒並行執行,例如jvm虛擬機器;gc執行緒、main執行緒、業務執行緒等);
-效能(本課程主要**原因,多執行緒效能更好,是相對的;在多核cpu上確實效能很好,服務端程式設計提高效能);
並行**比序列**複雜很多;
linus torvalids:平行計算主要在影象處理和服務端程式設計2個領域使用;
-摩爾定律失效:預計18個月晶元的效能會提高一倍;10年過去了,cpu的主頻還停留在4ghz。
無法提高單核cpu的頻率效能,所以在cpu中放多個核來提高效能。使用並行來提高多核效能,要注意多核問題。
2、幾個重要的概念
-同步和非同步
同步:方法呼叫之後。會等待方法返回;
非同步:方法呼叫之後會立即返回,後台另起乙個執行緒等待返回結果;可以繼續執行其他方法;
-併發和並行:一般不需要刻意區分,外界表現基本是一致的;
並行(parallelism):兩個執行緒(程序)同時執行。單核不存在並行。
併發(concurrency):乙個執行緒(程序)不停的切換,有排程的過程。
-臨界區:公共資源、共享資料,可被多個執行緒訪問。需要被控制的區域,防止資料被多個執行緒操作出現問題。資源被占用後,其他訪問執行緒進入等待佇列。
-阻塞和非阻塞:形容多執行緒間的相互影響
阻塞(blocking):如乙個執行緒占用了臨界區資源,其它執行緒必須在臨界區進行等待,執行緒掛起。交個作業系統排程,效能不會太好,執行緒上下文切換通常需要八萬個時鐘週期來處理。
非阻塞(non-blocking):非阻塞允許多個執行緒同時進入臨界區;
-鎖、飢餓和活鎖
死鎖(deadlock):紙和筆問題、哲學家就餐問題,搶占了資源不釋放,死鎖程式執行緒卡死,靜態問題,cpu占用0,;
飢餓(starvation):搶占資源時,作業系統一直排程不到一些優先順序比較低的執行緒;原子操作,迴旋鎖,cas操作,總是失敗,可能會餓死;
活鎖(livelock):電梯問題,活動的死鎖;同時搶占資源、同時釋放資源,動態問題,不好排查。
-並行的級別
a阻塞; 非阻塞(b無障礙、c無鎖、d無等待);
無障礙(obstruction-free ):最弱的非阻塞排程,所有你執行緒自由出入臨界區;寬進嚴出,無競爭時有限步完成,有競爭時若有衝突,回滾數聚;
無鎖(lock-free ):無障礙的,保證乙個執行緒可以勝出;比如cas
無等待(wait-free ):無鎖的,所有的執行緒在有限步內完成,無飢餓的;非阻塞最高端別的;讀操作是無等待的,優化寫操作達到無等待(複製寫區域,然後複製回去,指標操作迅速)。
3、並行的兩個重要定律:
amdahl定律(阿姆達爾定律) :定義了序列系統並行化後的加速比計算公式和理論上限;加速比=優化前耗時/優化後耗時;增加cpu處理器數量並不一定起到有效作用,提高系統內可並行化的模組比重,合理增加處理器數量,才是最小的投入,得到最大加速比;
gustafson定律(古斯塔夫森) :說明了處理器個數,序列比例和加速比之間的關係;只要足夠的並行化,那麼加速比和cpu個數成正比;
Java高併發程式設計筆記
jmm記憶體模型之 可見性 可見性是指當乙個執行緒修改了某乙個共享變數的值,其他執行緒是否能夠立即知道這個修改。jmm記憶體模型之 有序性 有序性問題的原因是因為程式在執行時,可能會出現指令重排,重排後的指令的順序未必一致。一條指令的執行可以分為很多步驟的 簡單來說就是以下幾步 1 取指if 2 解...
Java高併發程式設計學習筆記1
執行緒的runnable狀態 已經具備執行條件,只等待cpu排程 萬事俱備只欠東風 1 thread類中得start方法啟動乙個執行緒,並且該執行緒進入了可執行態 runnabel 2 run方法和start方法的區別。3 線 正的執行邏輯在run方法中,通常我們把run方法稱為執行緒的執行單元。重...
Java高併發程式設計讀書筆記
程序 程序是計算機彙總的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體 在當代面向執行緒設計的計算機結構中,程序是執行緒的容器。程式是指令 資料及其組織形式的描述,程序是程式的實體。執行緒是輕量...