共享變數可見性

2021-08-01 10:31:08 字數 610 閱讀 1793

可見性:多執行緒環境下,乙個執行緒修改共享變數,能夠及時被其他執行緒所感知

共享變數:乙個變數在多個執行緒的工作記憶體都存在副本,這個變數就是共享變數

執行緒對共享變數的操作只能在自己的工作記憶體中進行,不能主記憶體中操作

不同執行緒之間無法訪問其他執行緒工作記憶體中的變數,執行緒間變數值的傳遞通過主記憶體完成

共享變數的可見性實現原理:執行緒1修改共享變數後,立刻更新主記憶體,然後執行緒2立刻從主記憶體把值更新到執行緒2的工作記憶體

synchronized實現可見性:

加鎖時,清空工作記憶體中共享變數的值,從主記憶體讀取最新的值。

解鎖前,將工作記憶體中共享變數的值更新到主記憶體中

指令重排序:**書寫順序與實際執行順序不同,指令重排序是編譯器或處理器為了提高執行效率做的優化

編譯器優化的指令重排序、指令並行的重排序、記憶體系統的重排序

as-if-serial:無論如何重排序,程式執行的結果與**順序執行的結果一致

synchronized和volatile比較

synchronized需要加鎖,volatile不需要加鎖,volatile不會阻塞執行緒執行效率高

synchronized保證可見性和原子操作,volatile保證可見性和不保證原子操作

變數可見性問題

併發程式設計時各個執行緒中無法獲取到共享變數的最新值。共享變數儲存在主記憶體中,通常情況下各個執行緒在使用某個共享變數時先將共享變數複製進執行緒工作記憶體中,後續使用到該變數時直接從當前執行緒工作記憶體中獲取變數值,此時如果其他執行緒更改了該共享變數值那麼當前執行緒無法實時更新到該變數的最新值。同步...

JAVA多執行緒 共享變數的可見性問題

我們知道執行緒在工作的時候有自己的私有記憶體,工作記憶體。程式執行的時候從主記憶體拉取需要的變數到工作記憶體,處理完再返回主記憶體。這篇文章總結哪些 會使執行緒去主記憶體拉取變數。volatile修飾的變數,不論什麼語句都會從主記憶體拉取變數。該程式能順利完成,不會死迴圈。因為 isstop 用vo...

低可見性覆蓋高可見性

本文只討論 public,protected,private,internal 和 virtual一起使用時的問題。1.公共基類定義 public virtual 方法,子類覆蓋時不能降低其可見性。namespace accessmodifier public class baseclass pub...