java併發機制之volatile詳解

java併發機制之volatile詳解

在java的多線程編程中synchronized和volatile使用十分廣泛。volatile是一個輕量級的synchronized。它在多核併發編程中可以保證共享變量的“可見性“,在一個線程修改了被volatile修飾的共享變量時可以保證另外一個線程可以讀到這個修改後的的值,避免多個變量獨到的值內容不同。合適使用volatile 修飾符可以有效避免共享變量多線程中表現值不一致的問題。

volatile是在java語言規範第三版中推出的。java允許線程訪問共享變量,爲了確保共享變量被準確和一致的更新,線程應確保排它鎖的訪問共享變量。使用volatile修飾的變量在被多個線程訪問時可以起到排它效果。

volatile實現原理

要想了解volatile的實現原理前我們需要對cpu的相關術語有所瞭解。

術語 英文單詞 描述
內存屏障 memory barriers 一組處理器指令,用於限制對內存操作的順序
緩衝行 cache line cpu高速緩存中可以分配的最小單位。處理器在填寫緩存行時會加在整個緩存行
原子操作 atomic operations 不可中斷的一個或一系列操作
緩存行填充 cache line fill 當處理器識別到內存中可讀數值可以緩存時,將整個緩存行加在道cpu的高速緩存中
緩存命中 cache hit 如果進行高速緩存填充操作的內存位置仍然是下次操作的內存位置就直接衝高速緩存中或缺
寫命中 write hit 當處理器將操作數寫回到內存緩存時,它首先檢測操作數的內存地址是否在緩存中。如果內存地址在某緩存行中,則將操作數更新到緩存行中
寫缺失 write misses the cache 一個有效的緩存行被寫入到一個無效的內存中

要想了解volatile的實現原理我們可以從被valatile修飾的變量轉化爲彙編語言後的樣子分析(彙編不夠精通在此不談)。被volatile修飾的變量的彙編語句中會發現Lock 前綴的命令。

被Lock前綴修飾的命令在多核處理器中引發兩種事情:
_ 會將當前處理器的緩存行信息寫會內存。
_寫回內存操作會將其它處理器的相應的緩存行無效

被volatile修飾的變量在執行寫操作時會發出一個Lock命令。爲了保證在多線程模式下數據的可見性,就必須實現“緩存一致性協議“。實現緩存一致性協議的線程通過不斷嗅探總線上傳遞的數據來檢測自己緩存信息的有效性。當發現自己的緩存行地址被修改就將當前處理器的緩存行設置爲無效標誌。當需要對內存數據進行寫操作時再將數據加入到自己的緩存中進行處理。

volatile中通過lock命令前綴和緩存一致性協議來保證起多核多線程狀態下的可見性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章