鎖的一些基本概念

  1. 公平鎖VS非公平鎖

    • 公平鎖(Fair):加鎖前檢查是否有排隊等待的線程,優先排隊等待的線程,先來先得,例如每個線程搶佔鎖的順序爲先後調用lock方法的順序依次獲取鎖,類似於排隊吃飯。
    • 非公平鎖(Nonfair):加鎖時不考慮排隊等待問題,直接嘗試獲取鎖,獲取不到自動到隊尾等待,例如每個線程搶佔鎖的順序不定,誰運氣好,誰就獲取到鎖,和調用lock方法的先後順序無關,類似於堵車時,加塞的那些XXXX。

      synchronized就是非公平鎖,它無法保證等待的線程獲取鎖的順序;
      ReentrantLock 默認的lock()方法採用的是非公平鎖,但可以選擇公平鎖實現的方式。
      public ReentrantLock(boolean fair) //根據參數初始化爲公平鎖或者非公平鎖
      {
      sync = fair ? new FairSync() : new NonfairSync();
      }

  2. Volatile

    • 通過java內存模型(JMM)保證volatile的可見性和有序性。編譯器和處理器不會對存在數據依賴關係的操作做重排序,因爲這種重排序會改變執行結果。而線程與線程之間使用的是共享變量的副本,副本沒有依賴關係導致線程間可能出現重排序的問題;
    • JMM通過java進程之間的通信,控制主內存與每個線程的本地內存之間的交互,來爲java程序員提供內存可見性保證;
    • Volatile通過內存屏障保證寫的數據即時刷新到主內存,來防止線程間的重排序問題。
  3. 內存屏障的作用:

    • 阻止屏障兩邊的指令重排序;
    • 強制把寫緩衝區/高速緩存中的髒數據等寫回主內存,讓緩存中相應的數據失效。

    對Load Barrier來說,在讀指令前插入讀屏障,可以讓高速緩存中的數據失效,重新從主內存加載數據;
    對Store Barrier來說,在寫指令之後插入寫屏障,能讓寫入緩存的最新數據寫回到主內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章