java關鍵字系列之-volatile

###做用html

  • 保證不一樣線程對這個變量操做時的可見性。
  • 禁止重排序

###實現機制 彙編多出一個lock前綴指令(內存柵欄)緩存

###內存柵欄的做用線程

  • 它確保指令重排序時不會把其後面的指令排到內存屏障以前的位置,也不會把前面的指令排到內存屏障的後面;即在執行到內存屏障這句指令時,在它前面的操做已經所有完成。
  • 它會強制將對緩存的修改操做當即寫入主存。
  • 若是是寫操做,它會致使其餘CPU中對應的緩存行無效。

###使用volatile關鍵字的場景code

  • 對變量的寫操做不依賴於當前值
  • 該變量沒有包含在具備其餘變量的不變式中
狀態標記
volatile boolean flag = false;
while(!flag){
    doSomething();
}
public void setFlag() {
    flag = true;
}
禁止重排序
volatile boolean inited = false;
//線程1:
context = loadContext(); 
inited = true;            
//線程2:
while(!inited ){
     sleep()
}
doSomethingwithconfig(context);
//double check
class Singleton{
    private volatile static Singleton instance = null;
    private Singleton() {
    }
    public static Singleton getInstance() {
        if(instance==null) {
            synchronized (Singleton.class) {
                if(instance==null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

###參考 http://www.cnblogs.com/dolphin0520/p/3920373.htmlhtm

相關文章
相關標籤/搜索