1. 程式人生 > 實用技巧 >volatile 執行緒可見性

volatile 執行緒可見性

說起volatile,經常聽到的一句話就是使用了該關鍵字修飾的變數線上程中可見.

那麼為什麼不使用volatile的變數線上程中不可見?

首先來一段程式碼演示:

程式碼中bo設定了false了還一直在迴圈中.是為什麼?

這得從java記憶體模型中說起.

JAVA內在模型及操作規範

  1. 共享變數必須存放在主記憶體中.

  2. 執行緒有自己的工作記憶體,而且只可操作自己的工作記憶體

  3. 執行緒要操作共享變數,需從主記憶體中讀取到工作記憶體,改變值後需從工作記憶體中同步到主記憶體中

當執行緒2對共享變數bo改變後還沒有來得及寫入主存當中,執行緒2轉去做其它的事了,那麼執行緒1不知道執行緒2對bo變數的更改,執行緒1讀取的是自己工作記憶體中的bo變數

是主記憶體和執行緒中的工作記憶體的同步問題.

下面我們來加上volatile關鍵字:

如圖加上volatile關鍵字後很快執行完.並輸出i的值.

第一.使用volatile關鍵字會強制將修改的值立即寫入主存.

第二.使用volatile關鍵字的話,當執行緒2進行修改時,會導致執行緒1的工作記憶體中快取變數bo的快取行無效.當執行緒1再次讀取變數bo的值時發現自己的快取行無效,它會等待主存地址被更新之後,然後去對應的主存讀取最新的值.

請注意,volatile儲存可見性,不儲存原子性.