Volatile final synchronized均可以實現可見性。緩存
Volatile本質是在告訴jvm當前變量在寄存器中的值是不肯定的,須要從主存中讀取,synchronized則是鎖定當前變量,只有當前線程能夠訪問該變量,其餘線程被阻塞住。jvm
Volatile 僅能使用在變量級別,synchronized則能夠使用在變量,方法。優化
Volatile 僅能實現變量的修改可見性,但不具有原子特性,而synchronized則能夠保證變量的修改可見性和原子性。線程
Volatile不會形成線程的阻塞,而synchronized可能會形成線程的阻塞。排序
Volatile標記的變量不會被編譯器優化,而syncchronized標記的變量能夠被編譯器優化內存
使用volatile要知足的條件:編譯器
Volatile 的不變性:編譯
Volatile變量在賦值後會有一個lock add指令,這個指令至關於內存屏障,重排序時不能把屏障後的指令重排序到屏障前。變量
Volatile禁止指令重排序:普通變量僅僅會保證在方法的執行過程當中全部依賴賦值結果的地方都能得到到正確的結果,而不能保證變量賦值操做的順序與程序代碼中執行順序一致。程序
Volatile保證可見性:add指令會使得其餘工做線程的工做內存緩存的數據失效。