(1)原子性
定義: 即乙個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。
(2)可見性
定義:指當多個執行緒訪問同乙個變數時,乙個執行緒修改了這個變數的值,其他執行緒能夠立即看得到修改的值。
(3)有序性
定義:即程式執行的順序按照**的先後順序執行。
a.當寫乙個volatile變數時,jmm會把該執行緒本地記憶體中的變數強制重新整理到主記憶體中去;
b.這個寫會操作會導致其他執行緒中的快取無效。
重排序是指編譯器和處理器為了優化程式效能而對指令序列進行排序的一種手段。重排序需要遵守一定規則:
a.重排序操作不會對***存在資料依賴關係***的操作進行重排序。
比如:a=1;b=a; 這個指令序列,由於第二個操作依賴於第乙個操作,所以在編譯時和處理器運
行時這兩個操作不會被重排序。
b.重排序是為了優化效能,但是不管怎麼重排序,單執行緒下程式的執行結果不能被改變
比如:a=1;b=2;c=a+b這三個操作,第一步(a=1)和第二步(b=2)由於不存在資料依賴關係, 所以可能會發
生重排序,但是c=a+b這個操作是不會被重排序的,因為需要保證最終的結果一定是c=a+b=3。
volatile可以保證執行緒可見性且提供了一定的有序性,但是無法保證原子性。
i. 它確保指令重排序時不會把其後面的指令排到記憶體屏障之前的位置,也不會把前面的指令排到內
存屏障的後面;即在執行到記憶體屏障這句指令時,在它前面的操作已經全部完成;
ii. 它會強制將對快取的修改操作立即寫入主存;
iii. 如果是寫操作,它會導致其他cpu中對應的快取行無效。
1.volatile不適合應用於復合操作,即非原子性操作
2.volatile提供了可見性與有序性。
Volatile關鍵字實現原理
volatile作用 讓其他執行緒能夠馬上感知到某一線程多某個變數的修改 對共享變數的修改,其他的執行緒馬上能感知到 不能保證原子性 讀 寫 i 重排序 編譯階段 指令優化階段 輸入程式的 順序並不是實際執行的順序 重排序後對單執行緒沒有影響,對多執行緒有影響 volatile volatile規則...
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...
volatile關鍵字的原理,作用,使用
1,可以使得在多處理器環境下保證了共享變數的可見性。2,禁止指令重排序優化 什麼是可見性呢?在多執行緒環境下,讀和寫發生在不同的執行緒中的時候,可能會出現 讀執行緒不能及時的讀取到其他執行緒寫入的最新的值。這就是所謂的可見性。volatile 關鍵字是如何保證可見性的?使用 hsdis 這個工具,檢...