單詞解釋:
亂序執行:指cpu對**的執行順序進行亂序優化,但保證各執行**單元的順序按指令順序排列。以達到充分利用處理器的各處理單元的目的。(可以理解成:乙個任務有不同的執行單元,這些單元之間有一定的執行順序,但部分執行單元可提前工作,亂序執行就是讓這部分執行單元提前一段時間執行,從而提高整體的效率,減少整體執行時間)。
保證執行緒安全的核心要素:原子性和可見性(執行緒的同步機制都是圍繞這兩點來保證執行緒的安全性);
race condition(競爭條件):當兩個以上執行緒讀寫某些共享資料,而最後的結果取決於程序進行的精確時序,稱為競爭條件(race condition);
可見性問題出現原因:
為了協調cpu和記憶體讀寫速度巨大差異的問題,所以有了快取記憶體的出現(cpu不會每次獲取資料都從記憶體獲取,而是在快取記憶體中儲存有拷貝),但同時產生了可見性問題(由於cpu對記憶體中的物件的讀取並不是原子操作,所以執行緒a拿到的物件並不一定是執行緒b寫入的物件,此處有亂序執行的影響,但不止此因素)。
volatile只能保證操作的可見性,但無法保證操作的原子性,所以使用條件會比synchronized苛刻,如下(必須同時滿足):
1.更改不依賴於當前值,或能夠確保只會在單一執行緒中修改變數的值,如果對變數的修改依賴於現有值,就是乙個race condition操作,此時就需要使用其它方式了(比如synchronized),volatile對原子性的問題發能為力。
publicclass socketthread extends
thread
}}
其實,我覺著把「作業系統」系統學習一遍更好,不過,短期內暫時沒有這本書的學習計畫,往後排吧。
volatile的應用場景
下面先來想一下單例模式中的雙端檢查 public class singleton private static singleton getinstance return instance 思考這樣乙個場景 有兩個執行緒,執行緒a和執行緒b,執行緒a是初次訪問getinstance 方法,此時在第乙個...
Volatile的應用場景
1 當乙個變數可能會被意想不到的更新時,要使用volatile來宣告該變數,告訴編譯器它所修飾的變數的值可能會在任何時刻被意外的更新。2 語法 volatile int foo int volatile foo volatile int foo int volatile foo int volati...
volatile關鍵字的使用場景
使用場景 volatile如果想控制線程併發的話,需要判斷 volatile 保證了程式的可見性,但是用之前需要判斷下,如下 跑一下就清晰了,算是乙個低能耗的併發鎖,volatile能保證 資料被多個執行緒訪問的可見性,但是保證不了原子性,有點類似樂觀鎖 改後立刻同步到主記憶體.public cla...