公平鎖,非公平鎖,樂觀鎖,悲觀鎖

公平鎖/非公平鎖(多線程執行順序的維度)

概念理解

  • 公平鎖:加鎖前先查看是否有排隊等待的線程,有的話優先處理排在前面的線程,先來先得
  • 非公平所:線程加鎖時直接嘗試獲取鎖,獲取不到就自動到隊尾等待。

例子

  • ReentrantLock 同時支持兩種鎖
//建立一個非公平鎖,默認是非公平鎖

Lock nonFairLock= new ReentrantLock();

Lock nonFairLock= new ReentrantLock(false);

//建立一個公平鎖,構造傳參true

Lock fairLock= new ReentrantLock(true);

適用場景

  • 更多的是直接使用非公平鎖:非公平鎖比公平鎖性能高5-10倍,由於公平鎖須要在多核狀況下維護一個隊列,若是當前線程不是隊列的第一個沒法獲取鎖,增長了線程切換次數。

 

樂觀鎖/悲觀鎖(多線程操做共享數據的維度)

概念理解

  • 悲觀鎖:假設必定會發生併發衝突,經過阻塞其餘全部線程來保證數據的完整性。
  • 樂觀鎖:假設不會發生併發衝突,直接不加鎖去完成某項更新,若是衝突就返回失敗。

例子

  • 悲觀鎖:Synchronized多線程同步,具備排他性,也會容易產生死鎖。
  • 樂觀鎖:CAS機制,簡單來講會有三個操做數,當前內存變量值V,變量預期值A,即將更新值B,當須要更新變量的時候,會直接將變量值V和預期值A進行比較,若是相同,則直接更新爲B;若是不相同,則當前變量值V刷新到預期值中,而後從新嘗試比較更新。

適用場景

  • 樂觀鎖:適用於數據爭用不嚴重/重試代價不大/須要相應速度快的場景。
  • 悲觀鎖:適用於數據爭用嚴重/重試代價大的場景。
相關文章
相關標籤/搜索