本篇聊聊熟悉了cpu緩存一致性對編程有什麼幫助。java
一、數據對齊訪問編程
在一致性專題之cpu緩存一致性(一)中強調過先將要讀寫的數據當成1個字節。這是由於對於short、int、long、以及小數組而言可能會跨2個cache line,這樣cpu在讀寫時就要涉及到2個cache line,很明顯這是低效的。至於這個問題在實際中如何解決,準備再單獨寫一篇關於java的解決方案。數組
二、保持數據空間局部性緩存
在前面的數據空間局部性帶來的效率差別測試中已經給出了測試結果,它說的是儘可能將相鄰的數據放在一個cache中而且按照連續空間進行訪問。多線程
三、多線程編程時避免僞共享併發
在前面的java併發編程專題---僞共享中也給出了測試結果,它說的是在業務上沒有數據競爭,可是在cpu底層執行時因爲各自讀寫的數據在同一個緩存行中,從而致使大量的cache miss影響了執行效率。這裏對文中使用volatile關鍵字再作個補充說明,對於java而言若是沒有volatile關鍵字,因爲變量之間沒有競爭,即便在同一個緩存行中,各線程也只讀寫各自變量的緩存副本,這是由jvm的特性決定的。當加了volatile關鍵字就是要讓數據與內存同步,若是各自讀寫的變量在同一個緩存行中,這個時候就能夠用MESI緩存一致性原理來解釋了,由於當本核的cache line有數據更新時,其它核中的cache line就是被置爲無效,因此致使頻繁的cache miss。這種狀況具體參考一致性專題之cpu緩存一致性(二)中當數據所在cache line處於M狀態時的狀態轉移狀況。jvm