存儲器層次結構
緩存行
緩存行是爲了執行的更快。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指令後的讀寫操作前完成。