樂觀鎖:每次不加鎖而是假設沒有衝突而去完成某項操作,如果因為衝突失敗就重試,直到成功為止。
悲觀鎖:總是悲觀的認為某個執行緒在處理某份資源的時候,會有別的執行緒來修改資源,所以在資源上加鎖,一旦某個執行緒獲取該鎖,別的執行緒想要獲取該資源就會阻塞直至獲取鎖的執行緒釋放該鎖(獨佔鎖 synchronzied reentrantlock)
樂觀鎖的實現機制:
cas(compareandset):
三個基本運算元:
v:需要讀寫的記憶體值
a:要進行比較的值
b:要修改的新值
實現步驟:
1)獲取v值,並賦值給a
2)進行一系列操作後,想要把b值賦值給v值,重新獲取v值,判斷v 是否等於 a, 若相等則v = b, 否則重新進行上面的步驟,直至賦值成功!
缺點:
1)會出現aba問題, 即執行緒1 在對v進行操作的時候,執行緒2先把v修改了一遍,然後又修改回的原值(v的變化:原值-》新值-》原值),執行緒1在比較a與v的時候,發現沒有變化,就修改成功了。
2)在資源競爭激烈的情況下, cas出現自旋的概率較大,易浪費cpu資源
aba問題改進:
使用版本號(version)來解決aba問題, 每次在執行資料的修改操作時,都會帶上乙個版本號,一旦版本號和資料的版本號一致就可以執行修改操作並對版本號執行+1
操作,否則就執行失敗。
使用場景:
樂觀鎖適合於:多讀少寫
悲觀鎖適合於:多寫
悲觀鎖與樂觀鎖
悲觀鎖與樂觀鎖 悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗 了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次一 個事務讀取某一條記錄後,就會把這條記...
樂觀鎖與悲觀鎖
悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次乙個事務讀取某一條記錄後,就會把這條記錄鎖住,這樣 其它的...
樂觀鎖與悲觀鎖
鎖 locking 這個概念在我們學習多執行緒的時候曾經接觸過,其實這裡的鎖和多執行緒裡面處理併發的鎖是乙個道理,都是暴力的把資源歸為自己所有。這裡我們用到鎖的目的就是通過一些機制來保證一些資料在某個操作過程中不會被外界修改,這樣的機制,在這裡,也就是所謂的 鎖 即給我們選定的目標資料上鎖,使其無法...