樂觀鎖常見的兩種實現(xiàn)方式

版本號機制

一般是在數(shù)據(jù)表中加上版本號字段 version昵观,表示數(shù)據(jù)被修改的次數(shù)绸罗。當數(shù)據(jù)被修改時,這個字段值會加1驶兜。

舉個簡單的例子:假設(shè)帳戶信息表中有一個 version 字段,當前值為 1 ,而當前帳戶的余額( balance )為 100 抄淑。

  1. 操作員 A 此時準備將其讀出( version=1 )屠凶,并從其帳戶余額中扣除 50( 100-50 );
  2. 操作員 A 操作的過程中肆资,操作員 B 也讀入此用戶信息( version=1 )矗愧,并從其帳戶余額中扣除 20 ( 100-20 );
  3. 操作員 A 完成修改工作郑原,將數(shù)據(jù)版本號加1( version=2 )唉韭,連同帳戶扣除后余額( balance=50 ),提交到數(shù)據(jù)庫完成更新犯犁;
  4. 操作員 B 完成了操作属愤,也將版本號加1( version=2 )試圖向數(shù)據(jù)庫提交數(shù)據(jù)( balance=80 ),但此時比對數(shù)據(jù)庫記錄版本發(fā)現(xiàn)酸役,操作員 B 提交的數(shù)據(jù)版本號為 2 住诸,數(shù)據(jù)庫記錄的當前版本也為 2 ,不滿足 “提交版本必須大于記錄當前版本才能執(zhí)行更新“ 的樂觀鎖策略涣澡。

因此贱呐,操作員 B 的提交被駁回。這樣暑塑,就避免了操作員 B 用基于 version=1 的舊數(shù)據(jù)修改吼句,最終造成覆蓋操作員 A 操作結(jié)果的可能。

CAS 算法

compare and swap(比較與交換)事格,是一種有名的無鎖算法惕艳。無鎖編程,即不使用鎖(沒有線程被阻塞)的情況下實現(xiàn)多線程之間的變量同步驹愚,所以也叫非阻塞同步(Non-blocking Synchronization)远搪。CAS 算法涉及到三個操作數(shù):

  • 需要讀寫的內(nèi)存值 V
  • 進行比較的值 A
  • 擬寫入的新值 B

當且僅當 V 的值等于 A 時,CAS 通過原子方式用新值 B 來更新 V 的值逢捺,否則不會執(zhí)行任何操作(比較和替換是一個 native 原子操作)谁鳍。一般情況下,這是一個自旋操作劫瞳,即不斷的重試倘潜。

關(guān)于自旋鎖,可以看下這篇文章:《面試必備之深入理解自旋鎖》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末志于,一起剝皮案震驚了整個濱河市涮因,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伺绽,老刑警劉巖养泡,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗜湃,死亡現(xiàn)場離奇詭異,居然都是意外死亡澜掩,警方通過查閱死者的電腦和手機购披,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肩榕,“玉大人刚陡,你說我怎么就攤上這事〉惆眩” “怎么了橘荠?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長郎逃。 經(jīng)常有香客問我哥童,道長,這世上最難降的妖魔是什么褒翰? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任贮懈,我火速辦了婚禮,結(jié)果婚禮上优训,老公的妹妹穿的比我還像新娘朵你。我一直安慰自己,他們只是感情好揣非,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布抡医。 她就那樣靜靜地躺著,像睡著了一般早敬。 火紅的嫁衣襯著肌膚如雪忌傻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天搞监,我揣著相機與錄音水孩,去河邊找鬼。 笑死琐驴,一個胖子當著我的面吹牛俘种,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绝淡,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼宙刘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牢酵?” 一聲冷哼從身側(cè)響起荐类,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茁帽,沒想到半個月后玉罐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡潘拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年吊输,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铁追。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡季蚂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琅束,到底是詐尸還是另有隱情扭屁,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布涩禀,位于F島的核電站料滥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艾船。R本人自食惡果不足惜葵腹,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屿岂。 院中可真熱鬧践宴,春花似錦、人聲如沸爷怀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽运授。三九已至烤惊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徒坡,已是汗流浹背撕氧。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喇完,地道東北人伦泥。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像锦溪,于是被迫代替她去往敵國和親不脯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容