volatile和synchronized的區別與聯絡:
在Java中,為了保證多執行緒讀寫資料時保證資料的一致性,可以採用兩種方式:使用volatile關鍵字:用一句話概括volatile,它能夠使變數在值發生改變時能儘快地讓其他執行緒知道。如用synchronized關鍵字,表示或者使用鎖物件。volatile是一個變數修飾符,而synchronized是一個方法或塊的修飾符。所以我們使用這兩種關鍵字來指定三種簡單的存取變數的方式。所以volatile只能在執行緒記憶體和主記憶體之間同步一個變數的值,而synchronized則同步線上程記憶體和主記憶體之間的所有變數的值,並且透過鎖住和釋放監聽器來實現。顯然,synchronized在效能上將比volatile更加有所消耗。
volatile本質是在告訴jvm當前變數在暫存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當前變數,只有當前執行緒可以訪問該變數,其他執行緒被阻塞住。
volatile僅能使用在變數級別,synchronized則可以使用在變數,方法。volatile僅能實現變數的修改可見性,但不具備原子特性。volatile不會造成執行緒的阻塞,而synchronized可能會造成執行緒的阻塞。volatile標記的變數不會被編譯器最佳化,而synchronized標記的變數可以被編譯器最佳化。
volatile和synchronized的區別與聯絡:
在Java中,為了保證多執行緒讀寫資料時保證資料的一致性,可以採用兩種方式:使用volatile關鍵字:用一句話概括volatile,它能夠使變數在值發生改變時能儘快地讓其他執行緒知道。如用synchronized關鍵字,表示或者使用鎖物件。volatile是一個變數修飾符,而synchronized是一個方法或塊的修飾符。所以我們使用這兩種關鍵字來指定三種簡單的存取變數的方式。所以volatile只能在執行緒記憶體和主記憶體之間同步一個變數的值,而synchronized則同步線上程記憶體和主記憶體之間的所有變數的值,並且透過鎖住和釋放監聽器來實現。顯然,synchronized在效能上將比volatile更加有所消耗。
volatile本質是在告訴jvm當前變數在暫存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當前變數,只有當前執行緒可以訪問該變數,其他執行緒被阻塞住。
volatile僅能使用在變數級別,synchronized則可以使用在變數,方法。volatile僅能實現變數的修改可見性,但不具備原子特性。volatile不會造成執行緒的阻塞,而synchronized可能會造成執行緒的阻塞。volatile標記的變數不會被編譯器最佳化,而synchronized標記的變數可以被編譯器最佳化。