雖然已經工作了半年了...雖然一直是在做web開發....但是平時一直很少使用多執行緒.....
用例子來說明問題吧
1public
class
volatiletest 14}
15}1617
class a implements
runnable
2324
public
void
run()
2829}30
31class b implements
runnable
3738
public
void
run()
42int temp =r.a;
43if (temp == 0) 46}
47 }
在這個例子中我總共輸出了11次出現cpu指令重排
之所以會有這個輸出,是因為雖然在a類裡**是先將r.a設定為1,再修改r.b為true.(line:25,26)但是在cpu執行的時候仍然可能會先做第26行**,再做25行**..因為這2行**之間沒有什麼關聯.所以優化的時候可能會改變順序.這樣就導致了會輸出出現cpu指令重排
如果將volatiletest 的b屬性增加volatile關鍵字的話就不會有這個情況.它可以保證這個物件前面的操作與後面的操作的順序不會相互調換.相當於把原本**分成了2段(a類的run方法中25行之前的**是一段,25行之後的**是一段,只是這裡run裡的**比較少),前後2段**順序不會調換,但是這2段**自己內部之間的順序還是可以調換的.
這種問題在單執行緒下是不會出現的,因為如果前後2句**之間有關聯,那麼cpu會保證前一句**先於後一句**執行.但是在多執行緒裡得不到保證. 所以才需要volatile關鍵字
我現在對volatile的理解就是它像是synchronized的弱化版本.它可以阻止一些情況下的併發問題,但是另外一些情況的併發問題是阻止不了的.(後面會寫哪些情況可以哪些不可以)
volatile關鍵字 學習記錄2
1 public class volatiletest2 implements runnable 11system.out.println vt.resource 12 1314 override 15public void run 19 20 這個例子中雖然resource前面有volatile關...
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...
關鍵字volatile詳解
與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符 type specifier 關於volatile的作用 例如程式清單 volatile int m 10 int k,n m k i volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出...