淺談volatile關鍵字的作用
阿新 • • 發佈:2019-01-03
1、volatile關鍵字的作用是什麼? 多執行緒中的原子性、可見性、有序性分別表示什麼意思?
volatile關鍵字的作用:
volatile是java中的一個型別修飾符。它是被設計用來修飾被不同執行緒訪問和修改的變數。如果不加入volatile,基本上會導致這樣的結果:要麼無法編寫多執行緒程式,要麼編譯器失去大量優化的機會。
原子性:即一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。。
有序性:程式執行的順序按照程式碼的先後順序執行。
volatile關鍵字禁止指令重排序有兩層意思:
1)當程式執行到volatile變數的讀操作或者寫操作時,在其前面的操作的更改肯定全部已經進行,且結果已經對後面的操作可見;在其後面的操作肯定還沒有進行;
2)在進行指令優化時,不能將在對volatile變數訪問的語句放在其後面執行,也不能把volatile變數後面的語句放到其前面執行。
指令重排序:java語言規範規定JVM執行緒內部維持順序化語義。即只要程式的最終結果與它順序化情況的結果相等,那麼指令的執行順序可以與程式碼順序不一致,此過程叫指令的重排序。
指令重排序的意義:JVM能根據處理器特性(CPU多級快取系統、多核處理器等)適當的對機器指令進行重排序,使機器指令能更符合CPU的執行特性,最大限度的發揮機器效能。
volatile關鍵字的作用:
volatile是java中的一個型別修飾符。它是被設計用來修飾被不同執行緒訪問和修改的變數。如果不加入volatile,基本上會導致這樣的結果:要麼無法編寫多執行緒程式,要麼編譯器失去大量優化的機會。
可見性:就是指當一個執行緒修改了執行緒共享變數的值,其它執行緒能夠立即得知這個修改
當一個共享變數被volatile修飾時,它會保證修改的值會立即被更新到主存,當有其他執行緒需要讀取時,它會去記憶體中讀取新值。
原子性:即一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。。
有序性:程式執行的順序按照程式碼的先後順序執行。
volatile關鍵字能禁止指令重排序
1)當程式執行到volatile變數的讀操作或者寫操作時,在其前面的操作的更改肯定全部已經進行,且結果已經對後面的操作可見;在其後面的操作肯定還沒有進行;
2)在進行指令優化時,不能將在對volatile變數訪問的語句放在其後面執行,也不能把volatile變數後面的語句放到其前面執行。
指令重排序:java語言規範規定JVM執行緒內部維持順序化語義。即只要程式的最終結果與它順序化情況的結果相等,那麼指令的執行順序可以與程式碼順序不一致,此過程叫指令的重排序。
指令重排序的意義:JVM能根據處理器特性(CPU多級快取系統、多核處理器等)適當的對機器指令進行重排序,使機器指令能更符合CPU的執行特性,最大限度的發揮機器效能。