什麼是僞共享問題?

    僞共享指的是多線程在對不一樣變量進行修改操做時,若是變量位於同一個緩存行,當多線程競爭緩存行全部權時,每一個核都同時對緩存行進行修改,緩存子系統將會使其餘核的緩存行失效致使cache miss,最後升級到L3緩存進行修改,最後大大影響程序的執行效率,若是競爭的核不在同一個cpu插槽即不共享L3緩存,那就會去內存中進行修改,這樣引發的問題就是僞共享問題。數組

 

參考資料:緩存

僞共享(False Sharing)多線程

cache-line.png

圖1性能

圖1說明了僞共享的問題。在覈心1上運行的線程想更新變量X,同時核心2上的線程想要更新變量Y。不幸的是,這兩個變量在同一個緩存行中。每一個線程都要去競爭緩存行的全部權來更新變量。若是核心1得到了全部權,緩存子系統將會使核心2中對應的緩存行失效。當核心2得到了全部權而後執行更新操做,核心1就要使本身對應的緩存行失效。這會來來回回的通過L3緩存,大大影響了性能。若是互相競爭的核心位於不一樣的插槽,就要額外橫跨插槽鏈接,問題可能更加嚴重。線程

對於HotSpot JVM,全部對象都有兩個字長的對象頭。第一個字是由24位哈希碼和8位標誌位(如鎖的狀態或做爲鎖對象)組成的Mark Word。第二個字是對象所屬類的引用。若是是數組對象還須要一個額外的字來存儲數組的長度。每一個對象的起始地址都對齊於8字節以提升性能。所以當封裝對象的時候爲了高效率,對象字段聲明的順序會被重排序成下列基於字節大小的順序:對象

  1. doubles (8) 和 longs (8)
  2. ints (4) 和 floats (4)
  3. shorts (2) 和 chars (2)
  4. booleans (1) 和 bytes (1)
  5. references (4/8)
  6. <子類字段重複上述順序>

CPU緩存刷新的誤解排序

相關文章
相關標籤/搜索