1、鎖提供了兩種主要特性:互斥(mutual exclusion) 和可見性(visibility)。互斥即一次只允許一個執行緒持有某個特定的鎖,因此可使用該特性實現對共享資料的協調存取協議,這樣,一次就只有一個執行緒能夠使用該共享資料。可見性要更加複雜一些,它必須確保釋放鎖之前對共享資料做出的更改對於隨後獲得該鎖的另一個線程是可見的—— 如果沒有同步機制提供的這種可見性保證,則線程看到的共享變數可能是修改前的值或不一致的值,這將引發許多嚴重問題。
2、
在Java中,為了保證多執行緒讀寫資料時保證資料的一致性,可以採用兩種方式:
同步
如用synchronized,或使用鎖定物件.
volatile使用volatile關鍵字用一句話概括volatile,它能夠使變數在值發生改變時能盡快地讓其他線程知道.
而在這個過程,變數的新值對其他執行緒是不可見的.而volatile的作用就是使它修飾的變數的讀寫運算都必須在記憶體中進行!
volatile僅能使用在變數層級,synchronized則可以使用在變數,方法.
volatile僅能實現變數的修改可見性,但不具備原子特性,而synchronized則可以保證變量的修改可見性和原子性.
volatile不會造成線程的阻塞,而synchronized可能會造成線程的阻塞.
volatile標記的變量不會被編譯器優化,而synchronized標記的變數可以被編譯器優化.