初步认识Volatile-CPU层面的内存屏障
什么是內存屏障?從前面的內容基本能有一個初步的猜想,內存屏障就是將?store bufferes中的指令寫入到內存,從而使得其他訪問同一共享內存的線程的可見性。
X86的memory barrier指令包括lfence(讀屏障) sfence(寫屏障) mfence(全屏障)Store Memory Barrier(寫屏障)?告訴處理器在寫屏障之前的所有已經(jīng)存儲在存儲緩存(store bufferes)中的數(shù)據(jù)同步到主內存,簡單來說就是使得寫屏障之前的指令的結果對屏障之后的讀或者寫是可見的
Load?Memory Barrier(讀屏障)?處理器在讀屏障之后的讀操作,都在讀屏障之后執(zhí)行。配合寫屏障,使得寫屏障之前的內存更新對于讀屏障之后的讀操作是可見的
Full Memory Barrier(全屏障)?確保屏障前的內存讀寫操作的結果提交到內存之后,再執(zhí)行屏障后的讀寫操作
有了內存屏障以后,對于上面這個例子,我們可以這么來改,從而避免出現(xiàn)可見性問題
總的來說,內存屏障的作用可以通過防止CPU對內存的亂序訪問來保證共享數(shù)據(jù)在多線程并行執(zhí)行下的可見性?
但是這個屏障怎么來加呢?回到最開始我們講volatile關鍵字的代碼,這個關鍵字會生成一個Lock的匯編指令,這個指令其實就相當于實現(xiàn)了一種內存屏障
這個時候問題又來了,內存屏障、重排序這些東西好像是和平臺以及硬件架構有關系的。作為Java語言的特性,一次編寫多處運行。我們不應該考慮平臺相關的問題,并且這些所謂的內存屏障也不應該讓程序員來關心。
?
總結
以上是生活随笔為你收集整理的初步认识Volatile-CPU层面的内存屏障的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初步认识Volatile-MESI优化带
- 下一篇: 初步认识Volatile-JMM