1. 程式人生 > 實用技巧 >精妙絕倫!阿里資深架構師撰寫這份:併發程式設計,可謂“獨具匠心”

精妙絕倫!阿里資深架構師撰寫這份:併發程式設計,可謂“獨具匠心”

寫在前面

併發程式設計是Java程式設計師最重要的技能之一,也是最難掌握的一種技能。現在幾乎100%的公司不但面試都必須問到併發程式設計,而且在日常工作和開發當中更是需要併發程式設計的使用,尤其是在網際網路公司,它要求程式設計者對計算機最底層的運作原理有深刻的理解,同時要求程式設計者邏輯清晰、思維縝密,這樣才能寫出高效、安全、可靠的多執行緒併發程式。

併發程式設計筆記

計算機領域從來都不乏變革,每一次都帶來新的機遇與挑戰。“併發程式設計” 無疑是一場令人激動的變革。迎接技術變革與挑戰,是軟體開發者的空氣和水。很高興你已經讀到了這裡,那麼請不要停下來,繼續享受挑戰的樂趣,繼續面對這場變革,前進吧!

  • 程序
  • 執行緒
  • 併發
  • 並行

程序與執行緒

程序

  1. 程式由指令和資料組成,但這些指令要執行,資料要讀寫,就必須將指令載入至CPU,資料載入至記憶體。在指令執行過程中還需要用到磁碟、網路等裝置。程序就是用來載入指令、管理記憶體、管理IO的
  2. 當一個程式被執行,從磁碟載入這個程式的程式碼至記憶體,這時就開啟了一個程序。
  3. 程序就可以視為程式的一個例項。大部分程式可以同時執行多個例項程序(例如記事本、畫圖、瀏覽器等),也有的程式只能啟動一個例項程序(例如網易雲音樂、360 安全衛士等)

執行緒

  1. 一個程序之內可以分為到多個執行緒。
  2. 一個執行緒就是一個指令流 ,將指令流中的一條條指令以一定的順序交給CPU執行
  3. Java中,執行緒作為最小排程單位,程序作為資源分配的最小單位。 在windows中程序是不活動的,只是作為執行緒的容器

並行與併發

(由於內容太多了,為了不影響大家的閱讀體驗,以下大量內容省略......Σ( ° △ °|||)︴)

併發程式設計共享模型篇

共享模型之管程

共享帶來的問題

共享模型之記憶體

退不出的迴圈

共享模型之無鎖

CAS與volatile

CAS的特點

共享模型之不可變

日期轉換的問題

共享模型之工具

執行緒池

ThreadPoolExecutor

Executor執行緒配置

執行緒安全集合類概述

併發程式設計之原理篇

指令級並行原理

SuperScalar處理器

CPU快取結構原理

.CPU快取結構

CPU快取一致性

MESI協議

  • E、 S、M狀態的快取行都可以滿足CPU的讀請求
  • E狀態的快取行,有寫請求,會將狀態改為M,這時並不觸發向主存的寫
  • E狀態的快取行,必須監聽該快取行的讀操作,如果有,要變為S狀態

volatile原理

volatile的底層實現原理是記憶體屏障,Memory Barrier ( Memory Fence )

  • 對volatile變數的寫指令後會加入寫屏障
  • 對volatile變數的讀指令前會加入讀屏障

如何保證可見性

final原理

Monitor原理

Monitor被翻譯為監視器或管程

每個Java物件都可以關聯一個Monitor物件,如果使用synchronized給物件上鎖(重量級)之後,該物件頭的Mark Word中就被設定指向Monitor物件的指標

synchronized原理進階

輕量級鎖

  • 輕量級鎖的使用場景:如果一個物件雖然有多執行緒要加鎖,但加鎖的時間是錯開的(也就是沒有競爭) , 那麼可以使用輕量級鎖來優化。
  • 輕量級鎖對使用者是透明的,即語法仍然是synchronized
  • 假設有兩個方法同步塊利用同一個物件加鎖

自旋優化

重量級鎖競爭的時候,還可以使用自旋來進行優化,如果當前執行緒自旋成功(即這時候持鎖執行緒已經退出了同步塊,釋放了鎖), 這時當前執行緒就可以避免阻塞。

偏向鎖

  • 輕量級鎖在沒有競爭時(就自己這個執行緒), 每次重入仍然需要執行CAS操作。
  • Java 6中引入了偏向鎖來做進一步優化: 只有第一次使用CAS將執行緒ID設定到物件的Mark Word頭之後發現這個執行緒ID是自己的就表示沒有競爭,不用重新CAS。以後只要不發生競爭,這個物件就歸該執行緒所有

wait notify原理

park unpark原理

每個執行緒都有自己的一一個Parker物件

  • 執行緒就像一個旅人,Parker就像他隨身攜帶的揹包,條件變數就好比揹包中的帳篷。counter 就好比揹包中的備用乾糧(0為耗盡,1為充足)
  • 呼叫park就是要看需不需要停下來歇息
如果備用乾糧耗盡,那麼鑽進帳篷歇息.
如果備用乾糧充足,那麼不需停留,繼續前進
  • 呼叫unpark,就好比令乾糧充足
如果這時執行緒還在帳篷,就喚醒讓他繼續前進
如果這時執行緒還在執行,那麼下次他呼叫park時,僅是消耗掉備用乾糧,不需停留繼續前進

ReentrantLock原理

條件變數實現原理

每個條件變數其實就對應著一個等待佇列 ,其實現類是ConditionObject

讀寫鎖原理

(以上省略大量圖文內容.......,Σ( ° △ °|||)︴)

Semaphore原理

Semaphore有點像一個停車場, permits就好像停車位數量,當執行緒獲得了permits就像是獲得了停車位,然後停車場顯示空餘車位減一

為什麼要有PROPAGATE

LinkedBlockingQueue原理

併發程式設計之模式篇

同步模式之保護性暫停

即Guarded Suspension,用在一個執行緒等待另一個執行緒的執行結果

要點

  • 有一個結果需要從一個執行緒傳遞到另一個執行緒,讓他們關聯同一個GuardedObject
  • 如果有結果不斷從一個執行緒到另一個執行緒那麼可以使用訊息佇列(見生產者/消費者)
  • JDK中, join的實現、Future的實現,採用的就是此模式
  • 因為要等待另一方的結果,因此歸類到同步模式

同步模式之順序控制

固定執行順序

交替輸出

非同步模式之生產者/消費者

定義

非同步模式之工作執行緒

建立多少執行緒池合適

自定義執行緒池

終止模式之兩階段終止模式

兩階段終止模式

執行緒安全單例

享元模式

BATJ併發程式設計高頻面試題

  1. 現在幾乎100%的公司面試都必須面試併發程式設計,尤其是網際網路公司,對於併發程式設計的要求更高,併發程式設計能力已經成為職場敲門磚。
  2. 現在已經是移動互聯和大資料時代,對於應用程式的效能、處理能力、處理時效性要求更高了,傳統的序列化程式設計無法充分利用現有的伺服器效能。
  3. 併發程式設計是幾乎所有框架的底層基礎,掌握好併發程式設計更有利於我們學習各種框架。想要讓自己的程式執行、介面響應、批處理效率更高,必須使用併發程式設計。
  4. 併發程式設計是中高階程式設計師的標配,是拿高薪的必備條件。

借用Java併發程式設計實踐中的話”編寫正確的程式並不容易,而編寫正常的併發程式就更難了”,相比於順序執行的情況,多執行緒的執行緒安全問題是微妙而且出乎意料的,因為在沒有進行適當同步的情況下多執行緒中各個操作的順序是不可預期的,下面算是對多執行緒情況下同步策略的一個簡單介紹。

這份【併發程式設計】【併發程式設計之模式篇】【併發程式設計之原理篇】【併發程式設計之應用篇】文件共有390頁,需要完整版的朋友,可以點贊此文關注小編後,【見下圖】來獲取!!

當然,單單有文件看是遠遠不夠的,還有視訊和相匹配的課件進行學習提升,努力把併發程式設計這一塊兒給搞明白,相信一定會有不凡的人生!!

多執行緒與高併發學習視訊

多執行緒與高併發視訊課件分享

多執行緒與高併發視訊和課件獲取,關注小編,【見下圖】即可獲取!

好了,今天就分享到這裡了,希望大家能夠好好學習,把併發程式設計這一塊兒給提升上來,也希望本文能夠得到大家的喜歡!!