<var id="k6qs5"><sup id="k6qs5"></sup></var>

  • 志遠的gravatar頭像
    志遠 2021-09-22 15:08:51

    Java volatile值獲取的問題

    volatile型變量是每次都從主內存中重新獲取變量, 還是基于MESI 協議, 只有當前處理器嗅探到了緩存中存儲的值已經被修改而無效, 才從主內存中獲取呢

    所有回答列表(3)
    NYQFJGK的gravatar頭像
    NYQFJGK  LV1 2021年12月29日

    作者:酒行客
    鏈接:https://www.zhihu.com/question/31990408/answer/106725626
    來源:知乎
    著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

    在多線程編程中,我們最常用的是synchronized,而對volatile的使用,卻相對較少。這一方面是因為volatile的使用場景限制,另一方面是volatile使用需要更高的技術水平。

    我們先來看一幅java內存模型圖:

     

    Java volatile值獲取的問題

     

    每一個線程都有相應的工作內存,工作內存中有一份主內存變量的副本,線程對變量的操作都在工作內存中進行(避免再次訪問主內存,提高性能),不同線程不能訪問彼此的工作內存,而通過將操作后的值刷新到主內存來進行彼此的交互,這就會帶來一個變量值對其他線程的可見性問題。當一個任務在工作內存中變量值進行改變,其他任務對此是不可見的,導致每一個線程都有一份不同的變量副本。而volatile恰恰可以解決這個可見性的問題,當變量被volatile修飾,如private volatile int stateFlag = 0; 它將直接通過主內存中被讀取或者寫入,線程從主內存中加載的值將是最新的。

    junluozi的gravatar頭像
    junluozi  LV2 2022年3月11日
    • volatile 修飾符適用于以下場景:某個屬性被多個線程共享,其中有一個線程修改了此屬性,其他線程可以立即得到修改后的值,比如boolean ?ag ;或者作為觸發器,實現輕量級同步。
    • volatile屬性的讀寫操作都是無鎖的,它不能替代synchronized ,因為它沒有提供原子性和互斥性。因為無鎖,不需要花費時間在獲取鎖和釋放鎖_上,所以說它是低成本的。
    • volatile只能作用于屬性,我們用volatile修飾屬性,這樣compilers就不會對這個屬性做指令重排序。
    • volatile 提供了可見性,任何一個線程對其的修改將立馬對其他線程可見。volatile 屬性不會被線程緩存,始終從主存中讀取。
    • volatile提供了happens-before保證,對volatile變量v的寫入happens- before所有其他線程后續對v的讀操作。
    • volatile可以使得long和double的賦值是原子的。
    • volatile可以在單例雙重檢查中實現可見性和禁止指令重排序,從而保證安全性。



    作者:黑馬程序員
    鏈接:https://www.zhihu.com/question/31990408/answer/1028941563
    來源:知乎
    著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

    1372435480的gravatar頭像
    1372435480  LV2 2022年5月10日

    ddd

    頂部 客服 微信二維碼 底部
    >掃描二維碼關注最代碼為好友掃描二維碼關注最代碼為好友
    国产 国产 高清|护士奶头又白又大又好摸|中文字幕av一区二区三区|午夜亚洲国产理论片2020
    <var id="k6qs5"><sup id="k6qs5"></sup></var>