公平鎖與非公平鎖
公平鎖:乙個執行緒正持有鎖,還有一堆執行緒在佇列中等待,新進來乙個執行緒,進入佇列排隊被掛起(fifo先進佇列先得到)
非公平鎖:乙個執行緒正持有鎖,還有一堆執行緒在佇列中等待,新進來乙個執行緒,進入佇列排隊被掛起;但是,但是,但是如果發出請求的同時該鎖變成可用狀態,那麼這個執行緒就會跳過所有執行緒最先獲得鎖
效能比較:非公平鎖效能高於公平鎖的原因,鎖被掛起和喚醒是需要時間的,也就是鎖被喚醒到真正執行存在延遲;插隊可以帶來更高的吞吐量
適用場景:當持有鎖的時間相對較長,或請求鎖的平均時間相對較長時,使用公平鎖。因為這種插隊帶來吞吐量提公升的情況可能不會出現
樂觀鎖與悲觀鎖
悲觀鎖:每次操作之前都會先上鎖,其他執行緒阻塞
樂觀鎖:每次操作都不上鎖,操作之前判斷下原子性(即判斷下在此期間該資料有沒有被更新過)---版本控制或cas無鎖機制(進行比較的a,你寫入的新值b,需要讀寫的記憶體值v)
適用場景:樂觀鎖適用於多讀的情況,省去鎖的開銷,提高吞吐量;悲觀鎖適用於多寫的情況,減少衝突。
ps:多寫的情況下使用樂觀鎖,會產生衝突較多,上層應用會不停重試,開銷反而大。
cas一般情況下是乙個自旋操作,不斷重試-自旋cas-時間過長,cpu執行開銷會大。-解決:jvm支援處理器提供pause指令解決這個問題???
cas只能保證乙個共享變數的原子操作,jdk1.5以後可以把多個變數合併到乙個物件裡,形成乙個變數
synchronized的底層實現主要依靠 lock-free 的佇列,基本思路是 自旋後阻塞,競爭切換後繼續競爭鎖,稍微犧牲了公平性,但獲得了高吞吐量。
自旋鎖(輕量級鎖的優化):當執行緒沒有獲得鎖的情況下,一直迴圈嘗試獲得鎖,知道獲得鎖為止。—一直自旋也是會浪費cpu資源的。—while迴圈實現自旋鎖 —可以減少執行緒阻塞造成的執行緒切換(執行緒掛起恢復)
synchronized先自旋一段時間,還沒拿到鎖就進入阻塞狀態。
目標:降低執行緒切換的成本。
重量級鎖與輕量級鎖:
重量級鎖:同步方式成本比較高,系統呼叫核心態與使用者態切換,執行緒阻塞造成的執行緒切換等。---競爭非常激烈情況下用,讓競爭失敗的執行緒阻塞。
輕量級鎖:減少無實際競爭情況下,使用重量級鎖產生的消耗。(如cas鎖)
偏向鎖:
偏向鎖的假定,永遠把鎖給這個執行緒(及將來只有第乙個申請此鎖的人使用這把鎖)。
目標:減少無競爭且只有乙個執行緒使用鎖的情況下,使用輕量級鎖產生的效能消耗。
適用場景:
ps:輕量級鎖每次申請、釋放鎖都至少需要一次cas,但偏向鎖只有初始化時需要一次cas。
偏向鎖:無實際競爭,且將來只有第乙個申請鎖的執行緒會使用鎖。
輕量級鎖:無實際競爭,多個執行緒交替使用鎖;允許短時間的鎖競爭。
重量級鎖:有實際競爭,且鎖競爭時間長。
可重入鎖:某執行緒已經獲得鎖,重複獲得該鎖不會造成死鎖。—鎖的傳遞性
ORACLE鎖的分類。
現代的多使用者多工系統中,必然會出現多個使用者同時訪問共享的某個物件,這個物件可能是表,行,或者記憶體結構,為了解決多個使用者併發性訪問帶來的資料的安全性,完整性及一致性問題,必須要有一種機制,來使對這些共享資源的併發性訪問序列化,oracle中的鎖就可以提供這樣的功能,當事務在對某個物件進行操作前...
mysql g鎖 MySQL鎖分類
相對其他資料庫而言,mysql的鎖機制比較簡單,基最顯著的特點是不同的儲存引擎支援不同的鎖機制。比如,myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也去支援表級鎖 innodb儲存引擎既...
Oracle 鎖(概述 分類)
加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該資料物件有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作。oracle通過使用鎖 lock 機制維護資料的完整性 併發性和一致性。oracle在兩個不...