java多執行緒之記憶體可見性
阿新 • • 發佈:2019-02-18
可見性:一個執行緒對共享變數值的修改,能夠及時地被其他執行緒看到。
共享變數:如果一個變數在多個執行緒的工作記憶體中都存在副本,那麼這個變數就是幾個執行緒的共享變數。
e.g:主記憶體當中有一個變數x,多個執行緒同時包含有一個x的副本,當某個執行緒的工作的x值改變的時候要及時地被執行緒看到。就會一個問題,多個執行緒之間如何做到拿到的正確的x
- 把工作記憶體1中更新過的共享變數重新整理到主記憶體中
- 將主記憶體中最新的共享變數的值更新到工作記憶體2中
- 獲取互斥鎖
- 清空工作記憶體
- 從主記憶體拷貝最新副本到本地工作記憶體中
- 執行程式碼
- 將更改後的共享變數重新整理到主記憶體中
- 釋放鎖
- 對volatile變數執行寫操作時,會在寫操作後加入一條store屏障指令
- 對volatile變數執行讀操作時,會在讀操作前加入一條load屏障指令
synchronized和volatile區別:
- volatile 不需要加鎖,比synchronized更輕量級,不會阻塞執行緒。
- 從記憶體可見性角度,volatile讀相當於加鎖,volatile寫相當於解鎖
- synchronized既能保證可見性,又能保證原子性,而volatile只能保證可見性,無法保證原子性。