一旦一個共享變量(類的成員變量、類的靜態(tài)成員變量)被volatile修飾自后,就具備了兩層含義:
(1).保證不同線程對該變量進(jìn)行操作時的可見性,即一個線程修改了變量的值,新值對其他線程來說是立即可見的
(2).禁止進(jìn)行指令重排序
Volatile本職是告訴jvm當(dāng)前變量在寄存器(內(nèi)存)中的值是不確定的,需要從主存中讀取。synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線程可以訪問該變量,其他線程被阻塞
a.volatile僅能使用在變量上;synchronized可以使用在變量、方法、類上
b.volatile僅能實現(xiàn)變量的修改可見性,不能保證原子性;synchronized則可以保證變量的修改可見性和原子性
c.volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞
d.volatile標(biāo)記的變量不會被編譯器優(yōu)化;synchronized標(biāo)記的變量可以被編譯器優(yōu)化