悲觀者與樂觀者的做事方式完全不一樣,悲觀者的人生觀是一件事情我必須要百分之百完全控制才會去做,否則就認為這件事情一定會出問題;而樂觀者的人生觀則相反,凡事不管最終結果如何,他都會先嘗試去做,大不了最後不成功。這就是悲觀鎖與樂觀鎖的區別,悲觀鎖會把整個物件加鎖佔為自有後才去做操作,樂觀鎖不獲取鎖直接做操作,然後通過一定檢測手段決定是否更新資料。這一節將對樂觀鎖進行深入**。
上節討論的synchronized互斥鎖屬於悲觀鎖,它有乙個明顯的缺點,它不管資料存不存在競爭都加鎖,隨著併發量增加,且如果鎖的時間比較長,其效能開銷將會變得很大。有沒有辦法解決這個問題?答案是基於衝突檢測的樂觀鎖。這種模式下,已經沒有所謂的鎖概念了,每條執行緒都直接先去執行操作,計算完成後檢測是否與其他執行緒存在共享資料競爭,如果沒有則讓此操作成功,如果存在共享資料競爭則可能不斷地重新執行操作和檢測,直到成功為止,可叫cas自旋。
樂觀鎖的核心演算法是cas(compareand swap,比較並交換),它涉及到三個運算元:記憶體值、預期值、新值。當且僅當預期值和記憶體值相等時才將記憶體值修改為新值。這樣處理的邏輯是,首先檢查某塊記憶體的值是否跟之前我讀取時的一樣,如不一樣則表示期間此記憶體值已經被別的執行緒更改過,捨棄本次操作,否則說明期間沒有其他執行緒對此記憶體值操作,可以把新值設定給此塊記憶體。如圖2-5-4-1,有兩個執行緒可能會差不多同時對某記憶體操作,執行緒二先讀取某記憶體值作為預期值,執行到某處時執行緒二決定將新值設定到記憶體塊中,如果執行緒一在此期間修改了記憶體塊,則通過cas即可以檢測出來,假如檢測沒問題則執行緒二將新值賦予記憶體塊。
CAS機制 樂觀鎖的基礎
cas,即compare and swap,比較並交換。更新乙個變數的時候,只有當變數的預期值a和記憶體位址v當中的實際值相同時,才會將記憶體位址v對應的值修改為b。cas操作的就是樂觀鎖,每次不加鎖而是假設沒有衝突而去完成某項操作,如果因為衝突失敗就重試,直到成功為止。非阻塞 1.volatile...
redis的高階事務CAS 樂觀鎖
樂觀鎖介紹 watch指令在redis事物中提供了cas的行為。為了檢測被watch的keys在是否有多個clients同時改變引起衝突,這些keys將會被監控。如果至少有乙個被監控的key在執行exec命令前被修改,整個事物將會回滾,不執行任何動作,從而保證原子性操作,並且執行exec會得到nul...
基於libfiber的高併發服務優化策略
在網路和io訪問併發程度較高的應用場景中,通過使用libfiber進行優化,通過ab壓力測試工具和perf效能測試工具進行測試發現,使用fiber 協程 能夠顯著優化併發訪問質量,原因是協程將作業系統基於執行緒的排程策略修改為基於io資源的排程策略,乙個執行緒中可以有多個協程,但是同時執行的只有乙個...