一.使用
volatile是Java虛擬機提供的最輕量級的同步機制,相比與synchronized它更輕量級。如果使用它能滿足要求,就應該使用它而不是重量級的synchronized。
volatile用來修飾實例變量、靜態(tài)變量。
二.語義
2.1.可見性
jvm內存模型,分為工作區(qū)和主內存區(qū)。線程對變量進行操作時,先將變量拷貝到自己工作內存,修改后再同步回主內存。在線程修改完,還沒有同步回主內存時,其它線程是看不到變量的修改的。
而對于volatile修飾的變量,每次在工作內存修改后會強制同步回主內存,并使其它線程的緩存失效(失效后下次讀取就要回主內存讀?。?,保持變量的可見性。
2.2.有序性
volatile會禁止‘指令重排序優(yōu)化’。保證其前邊的語句,時間上在其之前執(zhí)行,其后邊的語句時間上在其之后執(zhí)行。
‘指令重排序優(yōu)化’可能會調整代碼執(zhí)行的順序,但保證同樣的執(zhí)行結果。如一些代碼調整前后順序后最后的結果沒有不同。
但這在多線程的某些情況下就會出問題。如,《深入理解Java虛擬機》369頁的例子。
2.3不保證原子性
對于非原子的操作,如i++,volatile并不能保證i++的結果立馬對其它線程可見。
因為i++是分解為三步進行:獲取i的值,計算出i+1,將結果寫會i。
而如i = 10,這樣的賦值操作就是原子操作,volatile可保證這個操作的可見性。
Java并發(fā)之基礎知識
Java并發(fā)之volatile關鍵字
Java并發(fā)之synchronized關鍵字
Java并發(fā)之原子類
Java并發(fā)之線程池
Java并發(fā)之并發(fā)工具類
Java并發(fā)之AQS原理
Java并發(fā)之ThreadLocal使用和源碼分析