對volatile的簡明解釋

2021-08-25 12:43:59 字數 606 閱讀 7041

[url]

volatile 關鍵字表示字段可能被多個併發執行執行緒修改。宣告為 volatile 的字段不受編譯器優化(假定由單個執行緒訪問)的限制。這樣可以確保該字段在任何時間呈現的都是最新的值。

其實volatile是由於編譯器優化所造成的乙個bug而引入的關鍵字。

int a = 10;

int b = a;

int c = a;

理論上來講每次使用a的時候都應該從a的位址來讀取變數值,但是這存在乙個效率問題,就是每次使用a都要去記憶體中取變數值,然後再通過系統匯流排傳到cpu 處理,這樣開銷會很大。所以那些編譯器優化者故作聰明,把a讀進cpu的cache裡,像上面的**,假如a在賦值期間沒有被改變,就直接從cpu的 cache裡取a的副本來進行賦值。但是bug也顯而易見,當a在賦給b之後,可能a已經被另乙個執行緒改變而重新寫回了記憶體,但這個執行緒並不知道,依舊按照原來的計畫從cpu的cache裡讀a的副本進來賦值給c,結果不幸發生了。

於是編譯器的開發者為了補救這一bug,提供了乙個volatile讓開發人員為他們的過失埋單,或者說提供給開發人員了乙個選擇效率的權利。當變數加上了volatile時,編譯器就老老實實的每次都從記憶體中讀取這個變數值,否則就還按照優化的方案從cache裡讀。

有關volatile的解釋

volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volatile nvint 當要求使...

O符號的簡明解釋

這是在stackoverflow的關於 演算法複雜度 的經典問答。將此文翻譯並分享下。問 by arec barrwin 大o符號的簡明英語解釋 大o符號的簡明英語解釋是什麼?用盡可能少的形式定義和簡單的數 算。答 by cletus 注意,所有人幾乎都會混淆大o符號 有上界 和theta符號 有兩...

對volatile的認知

volatile是jvm提供的輕量級同步機制 保證了不同執行緒對變數操作的記憶體可見性 強制執行緒每次讀取時從主記憶體取值 禁止指令重排序 編譯器可能對輸入指令進行執行重排序,各個語句執行的先後順序不一致,但會保證執行結果一致,但是忽略的資料的依賴性 通過在指令間新增記憶體屏障,強制重新整理cpu快...