樂觀鎖的實現(xiàn)方式有哪些?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)主要從事網(wǎng)頁設計、PC網(wǎng)站建設(電腦版網(wǎng)站建設)、wap網(wǎng)站建設(手機版網(wǎng)站建設)、成都響應式網(wǎng)站建設公司、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設行業(yè)積累了豐富的成都網(wǎng)站制作、網(wǎng)站設計、網(wǎng)站設計、網(wǎng)絡營銷經(jīng)驗,集策劃、開發(fā)、設計、營銷、管理等多方位專業(yè)化運作于一體。
樂觀鎖( Optimistic Locking ) 相對 悲觀鎖而言,樂觀鎖機制采取了更加寬松的加鎖機制。 悲觀鎖大多數(shù)情況下依靠 數(shù)據(jù)庫的鎖機制實現(xiàn),以保證操作最大程度的獨占性。但隨之而來的就是 數(shù)據(jù)庫性能的大量開銷,特別是對長 事務而言,這樣的開銷往往無法承受。而樂觀鎖機制在一定程度上解決了這個問題。樂觀鎖,大多是基于數(shù)據(jù)版本( Version )記錄機制實現(xiàn)。
1、版本號機制
一般是說在數(shù)據(jù)表中加上一個數(shù)據(jù)庫版本號version字段,在表述數(shù)據(jù)被修改的次數(shù)當數(shù)據(jù)被修改時,它的version 值會加1。
如:
當然線程A需要更新數(shù)據(jù)值時,在讀取數(shù)據(jù)的同時也會讀取 version 值,在提交更新時,若剛才讀取到的 version 值為當前數(shù)據(jù)庫中的 version 值相等時才更新,否則重試更新操作,直到更新成功。
2、CAS 算法
CAS(compare and swap) 比較并交換,有三個操作數(shù),內(nèi)存地址V ,預期值B,要替換得到的目標子A。
CAS指令執(zhí)行時,比較內(nèi)存地址V與預期值B是否相等,若相等則將A賦給B,(不相等則會循環(huán)比較直到相等)整個比較賦值操作是一個原子操作。
CAS缺點:
(1)循環(huán)時間開銷大:當內(nèi)存地址V與預期值B不相等時會一直循環(huán)比較直到相等;
(2)只能保證一個共享變量的原子操作;
(3)如果一個變量V初次讀取的時候是A值,并且在準備賦值的時候檢查到它仍然是A值,那么我們就能說明它的值沒有被其他線程修改過嗎?很明顯不是,因為在這段時間內(nèi)它的值可能被改為其他值,然后又被改回A,那CAS操作就會認為它從來沒被改過,這個問題就被稱為 CAS 操作的“ABA” 問題;
關于樂觀鎖的實現(xiàn)方式有哪些問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。