悲觀鎖:一段執行邏輯加上悲觀鎖,不同執行緒同時執行時,只能有乙個執行緒執行,其他的執行緒在入口處等待,直到鎖被釋放.
樂觀鎖:一段執行邏輯加上樂觀鎖,不同執行緒同時執行時,可以同時進入執行,在最後更新資料的時候要檢查這些資料是否被其他執行緒修改了(版本和執行初是否相同),沒有修改則進行更新,否則放棄本次操作.從解釋上可以看出,悲觀鎖具有很強的獨占性,也是最安全的.而樂觀鎖很開放,效率高,安全性比悲觀鎖低,因為在樂觀鎖檢查資料版本一致性時也可能被其他執行緒修改資料.
從下面的例子中可以看出來這裡說的安全差別.
/**
* 樂觀鎖
* * 場景:有乙個物件value,需要被兩個執行緒呼叫,由於是共享資料,存在髒資料的問題
* 悲觀鎖可以利用synchronized實現,這裡不提.
* 現在用樂觀鎖來解決這個髒資料問題
* *
*/public
class
optimisticlock
else
}/**
* b執行緒要執行的方法
*/public
static
void
invoke2
(int bvalue, string i)
throws interruptedexception
else
}/**
* 測試,期待結果:b執行緒執行的時候value資料總是當前最新的
*/public
static
void
main
(string[
] args) throws interruptedexception
}catch
(interruptedexception e)}}
).start()
;new
thread
(new
runnable()
}catch
(interruptedexception e)}}
).start()
;}}
測試結果:
a:10:1b版本不一致,不執行
b:利用value運算,value=1
a:2b:利用value運算,value=2
a:3
悲觀鎖與樂觀鎖
悲觀鎖與樂觀鎖 悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗 了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次一 個事務讀取某一條記錄後,就會把這條記...
樂觀鎖與悲觀鎖
悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次乙個事務讀取某一條記錄後,就會把這條記錄鎖住,這樣 其它的...
樂觀鎖與悲觀鎖
鎖 locking 這個概念在我們學習多執行緒的時候曾經接觸過,其實這裡的鎖和多執行緒裡面處理併發的鎖是乙個道理,都是暴力的把資源歸為自己所有。這裡我們用到鎖的目的就是通過一些機制來保證一些資料在某個操作過程中不會被外界修改,這樣的機制,在這裡,也就是所謂的 鎖 即給我們選定的目標資料上鎖,使其無法...