1. 程式人生 > >長話短說-Java中的volatile(面試常見)

長話短說-Java中的volatile(面試常見)

volatile,是Java提供的一種輕量級的同步機制,在併發程式設計中可以發揮一定作用,相對於sync的開銷來講要小的多;

volatile具備兩個特性:

特性1.保證共享變數對所有執行緒的可見性; 

     可見性:指當一個執行緒修改了共享變數的值,新值對於其他執行緒來說都是立即有感知的。

      補充:Java記憶體模型(JMM) jmm決定了一個執行緒對共享變數的寫入何時對其他執行緒可見,jmm定義了執行緒和主記憶體之間的抽象關係,共享記憶體儲存在主記憶體中,而每個執行緒由都有一個私有本地記憶體,本地記憶體儲存了該執行緒所使用到的主記憶體的拷貝副本,執行緒對變數的操作都必須是在工作記憶體中進行 而不能直接修改主記憶體的變數。(本地私有記憶體、主記憶體皆為抽象概念 方便大家瞭解)

    被volatile修飾的變數會是這樣:1> 當修改它時, jmm會把該執行緒對應的本地記憶體中修改的變數值  強制重新整理到主記憶體中;

        2> 這個寫操作 還會導致其他執行緒中的快取的變數副本 無效。

     這樣 是不是就保證了 這個變數的可見性啦~

特性2.禁止指令重排序

     重排序是指編譯器和處理器為了優化程式效能而對指令進行排序的手段,它有規則:

      1> 重排序不會對存在資料依賴關係的操作進行重排序(如:a=1;b=a; 這個指令序列,由於第二個操作依賴於第一個操作,所以在編譯時和處理器執行時這兩個操作不會被重排序。)

        2>重排序是為了優化效能 但是不管怎麼排序 單執行緒下程式的執行結果不能被改變.


參考連線:http://www.cnblogs.com/chengxiao/p/6528109.html