執行緒篇 volatile

2021-10-22 16:28:51 字數 774 閱讀 7968

volatile:可以解決可見性與有序性問題

cpu層面的記憶體屏障:

1.store barrier:強制所有在store屏障指令之前的stroe指令,都在該stroe指

令執行之前都執行完畢,並把store快取的資料全部寫回到記憶體

2.load barrier:強制所有在load屏障指令之後的load指令,都在該load屏

障指令之後

被執行,並且一直等到load快取區被cpu讀取完畢才執行之後的load指令

3.full barrier:整合了stroe barrier和load barrier屏障的功能

jvm根據這些屏障在jvm層面做了相應的處理禁用重排序與禁用快取來解決可見性

與有序性的問題

jmm層面對應了四種屏障:

1.loadload: loada loadload loadb :loada必須在loadb之前被讀取到cpu

2.stroestroe

3.loadstroe

4.stroeload

1.加了volatile,從本質上來看是通過記憶體屏障來禁用重排序而解決有序性問題,

以及通過禁用快取記憶體來解決可見性問題,其中禁用快取記憶體是通過lock指令

其中的寫屏障對應著stroe,禁用了重排序,,並且將值立刻寫回了記憶體,讀屏障保證在

執行assert value==10,快取區的值能夠被讀取到cpu,從而使這個斷言成立

多執行緒 volatile

目錄 1.volatile關鍵字的兩層含義 2.volatile關鍵字的原理和實現機制 3.volatile關鍵字的使用場景 4.volatile關鍵字與synchronized關鍵字的比較 1 保證了不同執行緒對這個變數進行操作的可見性。2 禁止進行指令重排序,能在一定程度上保持有序性。volat...

多執行緒 volatile

volatile主要用途 1 保證可見性 對volatile變數的寫指令後會加入寫屏障 寫屏障 在屏障之前的對共享變數的改動都同步到主存 對volatile變數的讀指令前會加入讀屏障 讀屏障 在該屏障之後對共享變數的讀取載入的都是主存中的新資料 2 保證有序性 寫屏障保證指令重排序時,不會講寫屏障之...

多執行緒 執行緒安全 volatile

學習思路 執行緒安全的三大特性 普通成員變數記憶體讀取流程 被volatile修飾後的成員變數 原子性 指定 塊是原子操作 要麼全成功要麼全失敗,不可拆分 可見性 修改共享變數時立即同步到主記憶體,保證對其它執行緒可見,讀取共享變數時直接從主記憶體讀取 有序性 的執行循序和語句的順序保持一致,在jv...