Java 鎖 概念介紹
阿新 • • 發佈:2020-12-07
一 Java中的鎖是什麼?
/* * 一 Java鎖定義? * 在電腦科學中,鎖(lock)或互斥(mutex)是一種同步機制,用於在有許多執行執行緒的環境中強制對資源的訪問限制。 * 鎖旨在強制實施互斥排他、併發控制策略。 * * 鎖的巨集觀分類? * 樂觀鎖 和 悲觀鎖。 * * 二 樂觀鎖? * 即認為讀多寫少,遇到併發寫的可能性低,每次去拿資料的時候都認為 別人不會修改,所以不會上鎖。 版本號機制 和 CAS演算法 來實現樂觀鎖。 但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數 據,採取在寫時 先讀出【當前版本號】,然後加鎖操作(比較跟上一次的版本號,如果一樣則更新), 如果失敗則要重複讀-比較-寫的操作 案例 銀行卡 理想型 事物之間不干擾。 事件一 進賬 本人銀行卡,到月發工資。 此時版本號1 餘額 0 , 到賬1000, 結束。 整個過程只有新增的一條記錄 完成後 版本號 + 1 此時版本號2 事件二 消費 銀行卡支付賬單,查詢餘額,此時版本號2 有1000 元 ,扣除消費金額10元 餘額 990元 此時版本號3 事件之間互相干擾 事件一和二,同時開始。 版本號都從1開始 讓事件一完成,此時的版本號是2 事件二開始,事件二會對版本號進行比較,此時版本號不一致。事件二就會失敗。 然後重複讀---比較----寫的操作。 cas演算法? 比較替換。 是一種更新的原子性操作,比較當前的值,和傳入的值是否一致性。 一樣則更新,否則失敗。 CAS利用CPU指令【呼叫的是本地方法】,從硬體層面保證了操作的原子性, 原語的執行必須是連續的。不存線上程切換的問題。以達到類似於鎖的效果。 無鎖操作,不可能出現死鎖情況。 cas(v,e,n) 想把v 修改成n ,需要v和e 進行比較,二者相同,才跟新變數v,然後把v的值給賦值給新值n。 v 需要更新的變數 e 預期值 n 新值 我們提供一個期望值 e ,當他和v 就是需要更新的變數是相等的。說明還沒有執行緒修改該值。可以執行cas操作。 反之,期望值和需要更新的變數不相等。說明已經被其他執行緒修改。就不執行更新操作。 可以重新讀取該變數,嘗試再次修改,也可以放棄操作。 cas bba問題? 對應一個版本號,一個數據一個版本,值相等,版本號相等,才能修改。 三 悲觀鎖 Synchronized 悲觀鎖(Pessimistic Lock), 做最壞的打算來處理問題,每次去拿資料的時候都認為別人會修改。 所以每次在拿資料的時候都會上鎖。這樣別人想拿資料就被擋住,直到悲觀鎖被釋放。 四 區別? 悲觀鎖阻塞事務,樂觀鎖回滾重試, 它們各有千秋,取決於實際使用場景。 像樂觀鎖適用於寫比較少的情況下,衝突很少發生的時候,這樣可以省去鎖的開銷,加大了系統的整個吞吐量。 但如果經常產生衝突,上層應用會不斷的進行重試,這樣反倒是降低了效能,所以這種情況下用悲觀鎖就比較合適。 * * * **/