Java并發(fā)之volatile關鍵字

一.使用

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使用和源碼分析

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容