重排序
為了提高程式處理效能 ,編譯器和處理器可能會對**執行順序進行亂序執行:
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的讀都是有原子性的,但是由於其實現方式並不是使用的同步的思想,所以並不能獨佔時間片。這也導致...