回覆列表
-
1 # JAVA架構
-
2 # 每天一個好影片
volatile 是把變數標識為“變化中的”。
意思是這個變數即使在(主執行緒)沒有任何存取操作的情況下也可能在(被其他執行緒)變化。
寫上提醒注意執行緒安全。Java 1.4及之前版本加了這個的變數也沒有同步安全。Java 5以後加了volatile後會在讀取方面有同步安全。
-
3 # simple204981511
在Java中執行緒安全主要考慮原子性,可見性和有序性
被volatile修飾的變數能夠保證每個執行緒能夠獲取該變數的最新值,即可見性
在多執行緒環境中,一般針對基礎型別變數可以採用該關鍵字進行同步,但是要注意非原子性操作,如++等,一般我都會使用原子操作類,其原理中就採用了該關鍵字
volatile是防止指令重排序來保證可見性
對於JVM層面是防止編譯器的重排序
同時,對於有些cpu來說,他們會透過快取鎖或者中線索來解決快取可見性
但是,目前很多cpu都做了最佳化,因為快取一致性MESI會帶來效能開銷,所以用到了storebuffer機制來做非同步處理,而這種機制帶來了指令的亂序執行。從而導致可見性問題。
那麼volatile會在cpu層面會增加記憶體屏障,來解決cpu的亂序執行帶來的可見性問題