1. 程式人生 > >volatile的應用及實現

volatile的應用及實現

volatile的應用

volatile是輕量級的synchronized,它在多處理開發中保證了共享變數的“可見性”,可見性的意思是當一個執行緒修改共享變數時,另一個執行緒能讀到這個修改的值。他不會引起執行緒上下文切換和排程。

volatile的實現原理

例:instance = new Singleton(); //instance是volatile變數。

轉換成彙編程式碼,如下:

0x01a3de1d: mov b $0---------;0x01a3de24: lock------

我們不關注彙編程式碼具體是什麼,關鍵在於其中的lock,有volatile變數修飾共享變數進行寫操作時會多出第二行程式碼,其中lock字首的指令在多核處理器引發了兩件事情:

  1. 將當前處理器快取行的資料寫回到系統記憶體。
  2. 這個寫回記憶體操作會使在其他CPU裡快取了改地址的資料無效。

為了提高處理速度,處理器會先將記憶體中的資料讀到內部快取後再進行操作,但操作完之後不知何時會寫到記憶體。如果對生命了volatile的變數進行寫操作,JVM會發送一條Lock指令,將這個變數所在的快取行的資料寫回系統記憶體。而且對於其他處理器其中還會有快取一致性協議:每個處理器通過嗅探在總線上的資料來檢查自己快取的值是不是過期了,當發現自己快取行對應的記憶體地址被修改,會將自己快取行設定為無效轉態,當處理器對這個資料進行修改操作的時候,會重新從記憶體中把資料讀到快取中來。

以上來自《Java併發程式設計的藝術》