標籤:volatile java 進階 程式員
本篇態度: simple & stupid
volatile用法:
private volatile Service.STATE state;
優點:
- 比其他的鎖機制(synchronized、lock)簡單;
- 不阻塞;
- 對volatile修飾的變數允許並發讀.
謹記:
Java Memory Model ensures that all threads see a consistent value for the variable
volatile提供變數修改後對其他線程的可見度。
變數被一個線程修改後,其他線程並發讀到的變數值是一致的,僅保證此變數讀和寫的原子性。
- 但
volatile修飾的共用變數不能作為多線程環境的計數器(i++),計數器需要其它同步手段。
i++ 等價於 : //從記憶體擷取i get(i);//(1) //i值加1 i = i + 1;//(2) //將i的值寫回記憶體 set(i);//(3) 操作(1)、(2)、(3)串起來的執行路徑不是原子性的.
推薦使用情境:
讀遠比寫多的時候,可以使用此關鍵字,同時給寫方法加鎖,來實現開銷更小的讀-寫鎖:
//使用voletile修飾state,提供跨線程的記憶體可見度(變數一致性)private volatile Service.STATE state;//讀 - 不會阻塞,可並發讀public Service.STATE getState() { return state; }//寫 - 使用synchronized修飾以保證原子性public synchronized Service.STATE enterState(Service.STATE proposed) { Service.STATE oldState = state; state = proposed; return oldState;}
【著作權@foreach_break 轉載請註明出處 部落格地址http://blog.csdn.net/gsky1986】
【進階java程式員應該知道的小知識】 volatile