volatile變數自身具有下列特性:
可見性。對乙個volatile變數讀,總是能看到(任意執行緒)對這個volatile變數最後的寫入。
原子性。對任意單個volatile變數的讀/寫具有原子性,但類似volatile這種復合操作不具有原子性。
volatile寫-讀的記憶體語義:
當寫乙個volatile變數時,jmm會把該執行緒對應的本地記憶體中的共享變數值重新整理到主記憶體。
當讀乙個volatile變數時,jmm會把該執行緒對應的本地記憶體置為無效。執行緒接下來將從主記憶體中讀取共享變數。
為了實現volatile記憶體語義,jmm會分別限制這兩種型別的重排序型別。
是否能重排
第二個操作
第乙個操作
普通讀/寫
volatile讀
volatile寫
普通讀/寫
novolatile讀
nono
novolatile寫
nono
從表中可以看出:當第二個操作是volatile寫時,不管第乙個操作是什麼,都不能重排序。這個規則確保volatile寫之前的不會被編譯器重排序到volatile寫之後。
當第乙個操作是volatile讀時,不管第二個操作是什麼,都不能重排序。這個規則確保volatile讀之後的操作不會被編譯器重排序到volatile讀之前,
當第乙個操作是volatile寫,第二個操作是volatile讀,不能重排序。
在每個volatile寫操作的前面插入乙個storestore屏障
在每個volatile寫操作後面插入乙個storeload屏障
在每個volatile讀操作後面插入乙個loadload屏障
在每個volatile讀操作的後面插入乙個storestore屏障
由於volatile僅僅保證對單個volatile變數的讀/寫具有原子性,而鎖的互斥執行的特性可以確保對整個臨界區**的執行具有原子性。在功能上,鎖比volatile更強大;在可伸縮性和執行效能上,volatile更具有優勢。
深入理解Java Volatile關鍵字
1.volatile關鍵字的作用是什麼?a.當乙個變數被定義為volatile之後,它將具備兩種特性 一 保證此變數對所有執行緒的可見性 可見性的意思為 當某個執行緒對volatile變數的值進行了修改,其他的執行緒是可以立即得知的 而普通的變數是無法做到這一點的,執行緒先是對工作記憶體當中的普通變...
記憶體管理 記憶體的簡介
32位機器具有4g的程式記憶體,這個記憶體並不是指實際的物理記憶體,而是虛擬記憶體這個虛擬記憶體並不是實際存在的。我們知道乙個虛擬空間由一組頁對映函式將虛擬空間的各個頁對映至相應的物理空間,那麼建立乙個虛擬空間實際上並不是建立空間而是建立對映函式所需要的相應的資料結構,在i386 的linux下,建...
靜態記憶體,棧記憶體和動態分配的記憶體 堆記憶體 的區別
1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的...