《java多線程編程核心技術》讀書筆記2.2:volatile關鍵詞

第二章 對象及變量的併發訪問

在我們講解volatile這個關鍵詞時,我們首先要,瞭解一下變量在內存中工作的過程:


java程序在運行的過程當中有主內存和線程內存之分:程序在啓動的時候會將所有的變量加載到主內存當中,線程在運行時有一下工作要做:

  1. read和load階段:線程從主存複製變量到當前線程工作內存
  2. use和asign階段:執行代碼,改變共享變量的值;
  3. store和write階段:用工作內存的數據刷新主存對應變量的值
      在多線程的環境下,use和asign是多次出現的,但這一操作並不是原子性的,也就是在read和load之後,如果主存count變量發生修改之後,線程工作內存的值由於已經加載,不會產生對應的變化,也就是私有內存和公有內存中的變量不同步,所以計算出來的結果會和預期不一樣,也就出現了非線程安全的問題。
       對於用volatile修飾的變量,JVM虛擬機只是保證從主存加載到線程工作內存的值是最新的。volatile關鍵字解決的是變量讀時的可見性問題,但是無法保證原子性,對於多個線程訪問同一個實例變量還是需要加鎖同步的。


volatile的作用就是每次在使用變量的時候,總是將主內存中的變量值和線程內存的變量值進行比較,如果不同則加載主內存中的值。

java特種兵裏面說:volatile的作用限制指令重排:

  1. 如果是一條對volatile變量進行賦值的操作的代碼,那麼該代碼前面的任何代碼不能與這個賦值操作交換順序。 如果這個操作後有普通變量的讀寫操作,則是可以與他交換順序的。在這個動作之前的指令相互之間還是可以重排的。,只是不能排序到該動作的後面。
  2. 如果是一條讀取volatile的代碼,則正好相反,在它後面的操作不允許與他交換順序,之後的多個動作依然可以重排,在他之前的普通變量的操作動作也可以與它交換順序。
 


















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