volatile 與 synchronized 區別

在Java中,爲了保證多線程讀寫數據時保證數據的一致性,能夠採用兩種方式:緩存

同步

如用synchronized關鍵字,或者使用鎖對象.多線程

volatile

使用volatile關鍵字
用一句話歸納volatile,它可以使變量在值發生改變時能儘快地讓其餘線程知道.jvm

volatile詳解

首先咱們要先意識到有這樣的現象,編譯器爲了加快程序運行的速度,對一些變量的寫操做會先在寄存器或者是CPU緩存上進行,最後才寫入內存.
而在這個過程,變量的新值對其餘線程是不可見的.而volatile的做用就是使它修飾的變量的讀寫操做都必須在內存中進行!
優化

volatile與synchronized

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

 

      volatile僅能使用在變量級別,synchronized則能夠使用在變量,方法.

 

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

 

      volatile不會形成線程的阻塞,而synchronized可能會形成線程的阻塞.

 

      volatile標記的變量不會被編譯器優化,而synchronized標記的變量能夠被編譯器優化.
相關文章
相關標籤/搜索