volatile和synchronized的區別

參考 https://blog.csdn.net/seu_calvin/article/details/52370068

1. volatile修飾的變量具有可見性

volatile是變量修飾符,其修飾的變量具有可見性。

可見性也就是說一旦某個線程修改了該被volatile修飾的變量,它會保證修改的值會立即被更新到主存,當有其他線程需要讀取時,可以立即獲取修改之後的值。

在Java中爲了加快程序的運行效率,對一些變量的操作通常是在該線程的寄存器或是CPU緩存上進行的,之後纔會同步到主存中,而加了volatile修飾符的變量則是直接讀寫主存。

2. volatile禁止指令重排

volatile可以禁止進行指令重排。

指令重排是指處理器爲了提高程序運行效率,可能會對輸入代碼進行優化,它不保證各個語句的執行順序同代碼中的順序一致,但是它會保證程序最終執行結果和代碼順序執行的結果是一致的。指令重排序不會影響單個線程的執行,但是會影響到線程併發執行的正確性。

程序執行到volatile修飾變量的讀操作或者寫操作時,在其前面的操作肯定已經完成,且結果已經對後面的操作可見,在其後面的操作肯定還沒有進行。

3.  synchronized

synchronized可作用於一段代碼或方法,既可以保證可見性,又能夠保證原子性。

可見性體現在:通過synchronized或者Lock能保證同一時刻只有一個線程獲取鎖然後執行同步代碼,並且在釋放鎖之前會將對變量的修改刷新到主存中。

原子性表現在:要麼不執行,要麼執行到底。

2. 總結
(1)從而我們可以看出volatile雖然具有可見性但是並不能保證原子性。

(2)性能方面,synchronized關鍵字是防止多個線程同時執行一段代碼,就會影響程序執行效率,而volatile關鍵字在某些情況下性能要優於synchronized。

但是要注意volatile關鍵字是無法替代synchronized關鍵字的,因爲volatile關鍵字無法保證操作的原子性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章