volatile作用:讓其他執行緒能夠馬上感知到某一線程多某個變數的修改
對共享變數的修改,其他的執行緒馬上能感知到
不能保證原子性 讀、寫、(i++)
重排序(編譯階段、指令優化階段)
輸入程式的**順序並不是實際執行的順序
重排序後對單執行緒沒有影響,對多執行緒有影響
volatile
volatile規則:
對於volatile修飾的變數:
(1)volatile之前的**不能調整到他的後面
(2)volatile之後的**不能調整到他的前面(as if seria)
(3)霸道(位置不變化)
對於volatile變數,當對volatile變數進行寫操作的時候,jvm會向處理器傳送一條lock字首的指令,將這個快取中的變數回寫到系統主存中。
public class shutdowsndemmo extends thread{
private volatile boolean started=false;
@override
public void run() {
while(started){
dowork();
public void shutdown(){
started=false;
dcl(7)
public class singleton {
private volatile static singleton instance;
public static singleton getinstance(){
if(instance==null){
synchronized (singleton.class){
instance=new singleton();
return instance;
volatile只能修飾變數,synchronized只能修飾方法和語句塊
synchronized可以保證原子性,volatile不能保證原子性
都可以保證可見性,但實現原理不同
volatile對變數加了lock,synchronized使用monitorenter和monitorexit monitor jvm
volatile能保證有序,synchronized可以保證有序性,但是代價(重量級)併發退化到序列
synchronized引起阻塞
volatile不會引起阻塞
對於volatile變數,當對volatile變數進行寫操作的時候,jvm會向處理器傳送一條lock字首的指令,將這個快取中的變數回寫到系統主存中。
但是就算寫回到記憶體,如果其他處理器快取的值還是舊的,再執行計算操作就會有問題,所以在多處理器下,為了保證各個處理器的快取是一致的,就會實現快取一致性協議
快取一致性協議:每個處理器通過嗅探在匯流排上傳播的資料來檢查自己快取的值是不是過期了,當處理器發現自己快取行對應的記憶體位址被修改,就會將當預處理器的快取行設定成無效狀態,當處理器要對這個資料進行修改操作的時候,會強制重新從系統記憶體裡把資料讀到處理器快取裡。
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...
volatile關鍵字的原理與使用
1 原子性 定義 即乙個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。2 可見性 定義 指當多個執行緒訪問同乙個變數時,乙個執行緒修改了這個變數的值,其他執行緒能夠立即看得到修改的值。3 有序性 定義 即程式執行的順序按照 的先後順序執行。a.當寫乙個volatil...
volatile關鍵字的原理,作用,使用
1,可以使得在多處理器環境下保證了共享變數的可見性。2,禁止指令重排序優化 什麼是可見性呢?在多執行緒環境下,讀和寫發生在不同的執行緒中的時候,可能會出現 讀執行緒不能及時的讀取到其他執行緒寫入的最新的值。這就是所謂的可見性。volatile 關鍵字是如何保證可見性的?使用 hsdis 這個工具,檢...