1. 程式人生 > >volatile的實現原理

volatile的實現原理

volatile關鍵字的作用

volatile是輕量級的synchronized,用於保證共享變數在多執行緒中的可見性,即一個執行緒修改了volatile標記的值的時候,另外一個執行緒可以讀到這個值,但是要注意,volatile不能保證複合操作的原子性

cpu的一些術語

一般狀況下的執行緒讀寫操作

cpu為了提高處理速度,不會直接與記憶體進行通訊,而是現將記憶體中的資料讀取到執行緒內部快取後在進行操作,這就造成了當多執行緒對共享變數進行操作的時候,就會造成修改過的值沒有辦法即時更新,出現併發問題

cpu如何保證volatile的可見性(多核處理器情況下)

添加了volatile關鍵字的共享變數在進行寫操作的時候會比平常的變數多出來一個Lock字首指令,這個指令主要就是做了兩件事情

  1. 將當前處理器快取的資料寫回到系統快取
  2. 是其他cpu中快取了該記憶體地址的資料無效

volatile的具體實現(在多核處理器情況下從讀和寫兩個方面分析)

  • 寫操作:在Lock字首指令引起處理器將快取寫回到記憶體的時候,會確保在聲言該訊號的時間內,處理器可以獨佔共享記憶體,也就是鎖匯流排,這樣其他的cpu就不能進行訪問訪問系統記憶體,在一些處理器中,Lock鎖定的不是匯流排,而是鎖快取(MESI控制協議),究其原因,鎖匯流排的開銷要比鎖快取要大,因為鎖匯流排其他cpu都要阻塞
  • 讀操作:處理器通過MESI控制協議維護內部快取和其他處理器的快取一致性,處理器通過嗅探在總線上傳播的資料來看檢查自己快取的值是不是過期了,也就是看自己快取對應的記憶體地址有沒有被修改,如果發現被修改,就將當前處理器的快取行設定為無效狀態,當要對這個資料進行修改的時候,吧資料重新從記憶體中讀入

volatile的使用場景

  • 對變數的寫操作不依賴於當前值
  • 該變數沒有包含在具有其他變數的不變式中