筆者認為看完一本書或剛要了解完乙個知識點 最好自己先執行一些demo 自己嘗試著去了解下各種意思 這樣知識點最終一定是你的。靠死記硬背的討論或簡單的粗暴的看下資料 腦子裡肯定還是一團漿糊。
從上述的列印結果你看懂了什麼。
總結如下:
1)上述中下行有兩行before內容,並沒有中規中矩的先before再end 說明了乙個知識點:程式在執行過程中被指令重排序了。主要原因是編譯器或處理器為了優化效能對指令序列進行排序的手段。
2)但是大家有沒有觀察到雖然表現為重排序但同乙個執行緒最終執行的結果是一樣的,並不因為多執行緒的影響把值給改掉。這是因為jmm記憶體模型決定的。對於區域性變數和方法引數都是執行緒私有的並不會被其他執行緒共享。
3)還有一點as-if-serial語義。不管怎麼重排序對於那種有依賴關係的單執行緒程式的執行結果不會被改變。處理器能保證對於有依賴關係的指令禁止重排序
CPU指令重排序
cpu的速度至少比記憶體快100倍,為了提公升效率,會打亂原來的執行效率,會在一條指令執行過程中 比如去記憶體讀資料,大概慢100多倍 去同時執行另一條指令 前提是兩條指令沒有依賴關係 體現在 層面 就是,寫在後面的 可能比前面的 先執行。觀察下面 測試指令重排序 public class reor...
Java 指令重排序與併發
一 指令重排序 編譯器或執行時環境 為了優化程式效能而採取的對指令進行重新排序執行的一種手段。指令重排序發生在不影響語義的情況下,也就是在單執行緒下,重排序不能導致執行結果發生變化。即遵循as if serial語義 進一步解釋就是在不影響執行結果的情況下,在jvm內的執行順序並不是嚴格按照書寫順序...
Volatile禁止指令重排序(三)
計算機在執行程式時,為了提高效能,編譯器和處理器常常會對指令重排,一般分為以下三種 源 編譯器優化的重排 指令並行的重排 記憶體系統的重排 最終執行指令單執行緒環境裡面確保最終執行結果和 順序的結果一致 處理器在進行重排序時,必須要考慮指令之間的資料依賴性 多執行緒環境中線程交替執行,由於編譯器優化...