volatile的應用與原理

2021-10-07 17:24:57 字數 1045 閱讀 6743

背景

多執行緒開發中,不少見 volatile,其很典型的標記就是可見性,接下來一起了解一下其原理吧

定義volatile 是輕量級的 synchronized,它在多處理器開發中保證了共享變數的「可見性"

可見性的意思是乙個執行緒修改乙個共享變數時,另外乙個執行緒能讀到這個修改的值

volatile 的使用比鎖的成本更低,因為它不會引起執行緒上下文的切換和排程術語

是一組處理器指令,用於實現對記憶體操作的順序限制

快取中可以分配的最小儲存單位

實現原理

有 volatile 修飾的變數,會在進行寫操作時,執行 lock 字首的指令,會引發下面兩件事情

當預處理器會獨佔該快取行;lock指令會鎖快取,而不是鎖匯流排

假如lock的快取已經才內部處理器中,則不會執行lock指令

大多數處理器使用mesi(修改、獨佔、共享、無效)控制協議(有興趣的同學可以去了解一下)去維護內部快取和其他處理器快取的一致性

多核處理器系統進行操作時,處理器能嗅探其他處理訪問系統記憶體和她們的內部快取

處理器使用嗅探技術保證它的內部快取、系統記憶體和其他處理器的快取的資料在匯流排上保持一致

如果通過乙個處理器來檢測其他處理器打算寫記憶體位址,而這個位址當前處於共享狀態,那麼正在嗅探的處理器將使它的快取行無效,在下次訪問相同記憶體位址時,強制執行快取行填充

volatile優化

追加位元組

volatile是鎖快取行的,如果是64位處理器,那麼就會鎖住64個位元組

假如兩個變數都在同乙個快取行,那麼每次操作其中乙個變數就會鎖住兩個變數了

優化方案:在兩個變數間加上60位,則不會造成快取行鎖定

不需要位元組追加的情況

volatile原理與技巧

為什麼使用 volatile 比同步代價更低?同步的代價,主要由其覆蓋範圍決定,如果可以降低同步的覆蓋範圍,則可以大幅提公升程式效能。而volatile 的覆蓋範圍僅僅變數級別的。因此它的同步代價很低。volatile 原理是什麼?volatile 的語義,其實是告訴處理器,不要將我放入工作記憶體,...

volatile的特點與應用

可見性 如果對宣告了volatile變數進行寫操作時,jvm會向處理器傳送一條lock字首的指令,將這個變數所在快取行的資料寫會到系統記憶體 有序性lock字首指令實際上相當於乙個記憶體屏障 也成記憶體柵欄 它確保指令重排序時不會把其後面的指令排到記憶體屏障之前的位置,也不會把前面的指令排到記憶體屏...

volatile實現原理

via yzwall技術筆記 volatile變數寫,彙編指令會多出lock字首,lock字首在多核處理器下的作用 針對編譯器重排序 jmm針對編譯器指定了volatile重排序規則表,規定哪些先後操作不能進行編譯器重排序 針對處理器重排序 編譯器在生成位元組碼指令時,通過在指令序列中插入記憶體屏障...