一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾後,會保證不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量後是立即可見的。另外會禁止指令重排序。
volatile本質是告訴jvm當前變量在寄存器中的值不確定,需要從主存中讀取。
synchronized是鎖定當前變量,只有當前線程可以訪問該變量。
1.volatile僅能使用在變量級別:
synchronized則是用在變量,方法,類級別的
2.volatile僅能實現變量修改的可見性,並不能保證原子性;
synchronized可以保證變量修改的可見性和原子性
3.volatile不會造成線程的阻塞
synchronized可能造成線程的阻塞
4.volatile標記的變量不會被編譯器優化
synchronized標記的變量會被編譯器優化