1. 程式人生 > >Java併發程式設計讀書筆記(一)

Java併發程式設計讀書筆記(一)

  前幾天整理電腦檔案的時候,突然發現了之前還在kindle儲存了關於併發程式設計的書,剛好自己在這方面挺薄弱的,故整理一波讀書筆記,繼續加強學習。

 

1.上下文切換

1.1 時間片分配演算法

時間片是CPU分配給各個執行緒的時間,CPU通過不停地切換執行緒執行,使各個執行緒彷彿是”同時執行的“。切換任務時會儲存上一個任務的狀態,任務從儲存到再載入的過程就是一次上下文切換。

多執行緒執行不一定比單執行緒執行任務快,因為執行緒有建立和上下文切換的開銷。

1.2 如何減少上下文切換

無鎖併發程式設計:多執行緒競爭鎖的時候會產生上下文切換,故多執行緒處理資料時可以採用一些方法來避免使用鎖。

CAS演算法(無鎖演算法):Compare-and-Swap 比較並替換。CAS有三個運算元,記憶體地址V、舊的預期值A和即將要更新的值B。CAS執行時,當且僅當記憶體地址V的值與預期值A相等時,將記憶體地址V值修改為B,否則什麼都不做。

使用最少執行緒:避免建立不需要的執行緒。

使用協程:在單執行緒裡實現多工的排程,並在單執行緒裡維持多個任務間的切換。

1.3 dump

jstack:Java虛擬機器自帶的一種堆疊跟蹤工具。用於生成Java虛擬機器當前時刻的執行緒快照,執行緒快照就是當前Java虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致額長時間等待等等。

dump檔案:是程序的記憶體映象。可以把程式的執行狀態通過偵錯程式儲存到dump檔案中。

Java執行緒dump:執行緒dump是非常有用的診斷java應用問題的工具,執行緒dump出來的資訊包含執行緒基本資訊如執行緒執行狀態、標識和呼叫的堆疊,呼叫的堆疊包含完整的類名、所執行的方法。可通過執行緒dump檔案來診斷很多JVM的問題,如執行緒阻塞、CPU使用率過高、堆記憶體不足等。

記憶體dump:當發現應用記憶體溢位或長時間使用記憶體很高的情況下,通過記憶體dump進行分析可以找出原因。

2.死鎖

2.1 產生死鎖的四個必要條件

互斥條件:一個資源一次只能被一個程序使用。

請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。

不剝奪條件:程序已獲得的資源,未使用完前,不能強行剝奪。

迴圈等待條件:若干程序間形成一種頭尾相接的迴圈等待資源關係。

2.2 避免死鎖的幾個常見方法

避免一個執行緒同時獲取幾個鎖

避免一個執行緒在鎖內同時佔用多個資源,儘量保證每個鎖只佔用一個資源

嘗試使用定時鎖來替代使用內部鎖機制

3.資源限制

3.1 什麼是資源限制

在併發程式設計時,程式的執行速度受限於計算機硬體資源或軟體資源。硬體資源限制有頻寬的上傳和下載速度、硬碟讀取速度和CPU處理速度。軟體資源限制有資料庫的連線數和socket連線數等。

3.2 資源限制引發的問題

某段序列的程式碼併發執行時受到資源限制,仍然在序列執行,這樣程式碼執行速度反而會更慢,因為增加了上下文切換和資源排程的時間。

3.3 如何解決

對於硬體資源限制,可考慮採用叢集並行執行程式,讓程式在多機上執行。對於軟體資源限制,可以考慮使用資源池將資源複用。在資源限制的情況下,根據不同的資源限制調整程式的併發度,可讓程式執行得更快。