悲觀鎖
總是假設最壞的情況,每次拿數據都認為別人會修改數據,所以要加鎖,別人只能等待,直到我釋放鎖才能拿到鎖;數據庫的行鎖、表鎖、讀鎖、寫鎖都是這種方式,java中的synchronized和ReentrantLock也是悲觀鎖的思想。
樂觀鎖
總是假設最好的情況,每次拿數據都認為別人不會修改數據,所以不會加鎖,但是更新的時候,會判斷在此期間有沒有人修改過;一般基於版本號機制實現。
使用場景
樂觀鎖適用於讀多寫少的情況,即沖突很少發生;如果是多寫的情況,應用會不斷重試,反而會降低系統性能,這種情況最好用悲觀鎖,因為等待到鎖被釋放后,可以立即獲得鎖進行操作。