volatile相當于是一個輕量級的synchronized,一般作用在變量上,它具有三個特性:可見性、有序性,相比于synchronized,他的執行成本更低。
先來說可見性,java存在共享變量不可見性的原因就是,線程不可以直接操作主內存,他需要虛擬一個本地內存,正是因為這樣,這兩個內存就容易因為多線程的原因出現主內存和本地內存不一致的現象,而volatile就是解決了這點,具體就是通過一個Lock指令,這個指令使得當你在訪問變量的時候需要判斷你的內存地址是否有效,如果有效則更改并且會通知其他處理器緩存使得他們對于這個共享變量的內存地址都失效,如果發先內存地址實效,則需要重新從本地內存讀取,從而實現了可見性。
有序性是有效避免了編譯器和處理器對指令的重排序,它在編譯器生成字節碼時插入內存屏障(CPU指令)來禁止指令重排序從而解決。
volatile只能保證在讀取和寫入的操作是最新的但是對于i++這種復合操作就無法確保原子性。