synchronized和volatile(可見性與禁止指令重排序)區別?

Volatile final synchronized均可以實現可見性。緩存

 Volatile本質是在告訴jvm當前變量在寄存器中的值是不肯定的,須要從主存中讀取,synchronized則是鎖定當前變量,只有當前線程能夠訪問該變量,其餘線程被阻塞住。jvm

 Volatile 僅能使用在變量級別,synchronized則能夠使用在變量,方法。優化

 Volatile 僅能實現變量的修改可見性,但不具有原子特性,而synchronized則能夠保證變量的修改可見性和原子性。線程

 Volatile不會形成線程的阻塞,而synchronized可能會形成線程的阻塞。排序

 Volatile標記的變量不會被編譯器優化,而syncchronized標記的變量能夠被編譯器優化內存

使用volatile要知足的條件:編譯器

  1. 運算結果不依賴與變量的當前值,或者保證只有一個線程修改變量的值。
  2. 不須要與其餘狀態變量參與不變約束
  3. 在訪問變量時不須要加鎖

Volatile 的不變性編譯

  1. 將當前處理器緩存行的數據會寫回到系統內存
  2. 這個寫回內存的操做會引發在其餘CPU裏緩存了該內存地址的數據無效

Volatile變量在賦值後會有一個lock add指令,這個指令至關於內存屏障,重排序時不能把屏障後的指令重排序到屏障前。變量

Volatile禁止指令重排序:普通變量僅僅會保證在方法的執行過程當中全部依賴賦值結果的地方都能得到到正確的結果,而不能保證變量賦值操做的順序與程序代碼中執行順序一致。程序

Volatile保證可見性:add指令會使得其餘工做線程的工做內存緩存的數據失效。

相關文章
相關標籤/搜索