Java 內存模型:存儲器、緩存行、僞共享、cpu亂序、指令重排

存儲器層次結構

緩存行

緩存行是爲了執行的更快。intel 的緩存行大小是64字節。

僞共享:如果,x,y 在一起。爲了提高效率,會一起讀到L2 裏面,當多線程時,左邊L2和右邊L2可能都進行了讀取。左邊L2 修改了X,右邊L2修改了Y,這時就需要通知其它CPU進行重新讀取,此時需要進行其它cpu的通知。從而影響了效率。

解決:使用緩存行對齊。 jdk8 @Contended 註解

CPU亂序執行:可以提高效率

cpu爲了提高指令效率,會在一條指令執行過程中(比如去內存讀數據(慢100倍)),去同時執行另一條指令,前提是,兩條指令沒有依賴關係

比如: int a = 0;  int y = 5; a = getm();  y = 9;   這時可能需要 等待執行getm();  但是 int y = 5; y = 9; 執行不受影響,所以可能會進行亂序執行。

有序性保障: cpu內存屏障 (非JVM內存屏障)

sfence:  store| 在sfence指令前的寫操作當必須在sfence指令後的寫操作前完成。
lfence:load | 在lfence指令前的讀操作當必須在lfence指令後的讀操作前完成。
mfence:modify/mix | 在mfence指令前的讀寫操作當必須在mfence指令後的讀寫操作前完成。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章