深入學習Java併發之一 併發學習總覽

2021-09-02 14:27:19 字數 850 閱讀 1616

重排序

為了提高程式處理效能 ,編譯器和處理器可能會對**執行順序進行亂序執行:

int i = 5;//1

int k = 1;//2

int j = 5;//3

i = 10; //4

k= i; //5

在如上**片中,1、2和3可以進行重排序。因為1和2都被賦值為了5,在機器碼層面上,可以取出5這個值,依次賦給i和j,再執行給k賦為1的操作,這樣少了一次5這個數字的取出操作。

比如上述**片中,4與5就不可以進行重排序,因為語句5用到了語句4執行的結果,4的執行與否對5有「影響」。

可以看出來,jmm對基本的程式邏輯有序進行了保證,也對sychronized和volatile關鍵字都進行了支援。

jmm記憶體模型

主記憶體:各執行緒公用,儲存了所有變數。

工作記憶體:各執行緒私有,儲存著該執行緒可能用到的變數,拷貝自主記憶體。執行緒對變數的所有操作必須在工作執行緒內進行。

這種記憶體模型,可以通過工作記憶體與主記憶體的資料互動,來完成資料可見性的實現,事實上,volatile就是這麼做的(後面再說)。

鎖或迴圈cas

原子性的實現只能依靠鎖(悲觀/樂觀)來實現,因為原子性要依賴於對資源的獨佔。

volatile

【深入學習併發之二】volatile關鍵字詳解

synchronized

【深入學習併發之三】synchronized關鍵字詳解

//鏈結坑位

java併發程式設計(一) 併發程式設計需要注意問題

目錄 問題一上下文切換會帶來額外的開銷 執行緒的執行機制 什麼是上下文切換 上下文切換的過程 上下文切換是有開銷的 如何減少上下文切換 問題二併發不當可能會產生死鎖 什麼是死鎖 死鎖示例 如何避免死鎖 問題三計算機資源會限制併發 誤區執行緒越多速度越快 什麼是資源 如何解決資源的限制 併發是為了提公...

學習java併發程式設計(一)

1 任務的認識 任務可以看作是乙個implements runnable的乙個類,任務的內容就是定義在run 方法中的內容 2 thread executor 當使用new thread runnable r start 時,即客戶端 也就是編寫程式的開發人員 直接在新執行緒中執行任務,而在使用ex...

深入學習併發之二 volatile關鍵字詳解

若閱讀過程中出現疑問,可先閱讀併發學習總覽 volatile滿足了併發中的原子性 可見性和區域性有序性,但是其中的原子性是存在侷限性的。volatile原子性的侷限 volatile變數的寫和volatile的讀都是有原子性的,但是由於其實現方式並不是使用的同步的思想,所以並不能獨佔時間片。這也導致...