鎖:公平鎖/非公平鎖、悲觀鎖/樂觀鎖

 

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

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

例子

  • 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刷新到預期值中,然後重新嘗試比較更新。

適用場景

  • 悲觀鎖:適用於數據爭用嚴重/重試代價大的場景。
  • 樂觀鎖:適用於數據爭用不嚴重/重試代價不大/需要相應速度快的場景。

 

 

 

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