volatile變量,是稍弱的同步機制,不會被緩存到寄存器或者其餘處理器不可見的地方,所以讀取時,總會返回當前的最新值。這個性質,就是可見性,是Volatile的關鍵做用之一。可是Volatile的語義不足以確保遞增操做的原子性,在多線程的狀況下,線程不必定是安全的。緩存
由於編譯器優化、指令重排序、內存系統重排序緣由,程序執行的順序,不必定等於咱們編寫的順序,Volatile會禁止重排序。安全
單例模式(懶漢模式)
咱們模擬兩個線程A,B,在還沒建立單例對象的時候,一塊兒進入getInstance方法。多線程
檢查某個狀態標記,以判斷是否退出循環優化
Volatile boolean done; .... 某個方法{ while(done){ doSomeThing1(); } doSomeThing2(); }
這邊和用普通的變量的區別是,在多線程的狀況下,取到done後,done的值被改變了,while判斷會不正確。spa