這裡一共有main執行緒和new出來的兩個執行緒,兩個執行緒中各自有自己的快取,
如果沒有volatile的話,每次都一般只會從自己的執行緒的緩衝區裡面拿值,所有main改變了也沒什麼用,而加了volatile的值一旦發生改變,存有running值的執行緒會自動被提示
該值已過期,就會再從主線程裡面重新獲取running,
public
class
testvolatile
system.out.
println
("e end!");
}public
static
void
main
(string[
] args)
catch
(interruptedexception e)
t.running=
true;}
}
不過volatile 並不能保證多個執行緒共同修改變數時所帶來的不一致問題
乙個執行緒從主線程的記憶體中讀到0,加一,與此同時另乙個執行緒也讀到了0,因為有volatile,所以volatile所以主線程的count變為1,而另乙個執行緒將1也放到主線程中,只會覆蓋原有的1,所以執行了兩個執行緒只加了1,
public
class
testvolatile
public
static
void
main
(string[
] args)
threads.
foreach
((o)
->o.
start()
);threads.
foreach
((o)
->
catch
(interruptedexception e)})
; system.out.
println
(t.count);}
}
count++不具備原子性。可以用synchornized或者atomicinteger解決
atomicinteger count=
newatomicinteger(0
);// volatile int count=0;
voidm(
)
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...
c中volatile關鍵字的用法
好吧,以前都沒怎麼注意有這個關鍵字 c作為中級語言,和底層有很多的聯絡,那麼有必要熟悉volatile的用法。volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯,vc 在產生release版可執行碼時...
C語言中volatile關鍵字用法
介紹volatile關鍵字之前我們先了解一下編譯器的優化。快取記憶體 處理器讀取程式裡面的資料時,把一些訪問頻率比較高的資料,臨時儲存到暫存器 register 中,當需要取資料時,就會從 register 中取,而不是直接去從 memory 記憶體 中取,節約了時間,像這樣的過程,叫做快取記憶體。...