java高併發程式設計學習筆記一前言

2021-08-09 08:39:35 字數 1516 閱讀 2658

一、前言

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高併發程式設計讀書筆記

程序 程序是計算機彙總的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體 在當代面向執行緒設計的計算機結構中,程序是執行緒的容器。程式是指令 資料及其組織形式的描述,程序是程式的實體。執行緒是輕量...