1. 程式人生 > 實用技巧 >Java 鎖 概念介紹

Java 鎖 概念介紹

一 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), 做最壞的打算來處理問題,每次去拿資料的時候都認為別人會修改。
        所以每次在拿資料的時候都會上鎖。這樣別人想拿資料就被擋住,直到悲觀鎖被釋放。
        
    四 區別?
        悲觀鎖阻塞事務,樂觀鎖回滾重試,
        它們各有千秋,取決於實際使用場景。
        
        像樂觀鎖適用於寫比較少的情況下,衝突很少發生的時候,這樣可以省去鎖的開銷,加大了系統的整個吞吐量。
        但如果經常產生衝突,上層應用會不斷的進行重試,這樣反倒是降低了效能,所以這種情況下用悲觀鎖就比較合適。
         
        
        
        
        
        
 * 
 * 
 * 
 * 
 
*/