樂觀鎖 悲觀鎖 讀寫鎖 互斥鎖之間的關係

2021-10-11 19:14:30 字數 607 閱讀 3808

同一維度的概念,都是從資料訪問的角度來說。所以經常出現在資料庫相關問題中、

即當資料同時被多個物件訪問了,應該持什麼態度來對資料進行保護

悲觀鎖認為,資料被訪問,對方很可能要修改這個資料。所以在此思想的引導下,資料被訪問時,不管是讀還是寫,步步加鎖。嚴格排斥其他物件的訪問。

樂觀鎖認為,資料被訪問,對方不大可能要修改這個資料。所以在此思想的引導下,乙個物件讀這個資料,不會排斥其他的訪問(包括讀和寫),只有在自己寫的時候,通過cas的方式,確定自己寫的時候,沒人動過這個資料。有人動過,則取消重讀再重試。

這兩種鎖,是兩種思想。

互斥鎖的規則,即所有單個的讀、寫行為互斥、資源獨佔

,讀的時候別人不能讀也不能寫。寫的時候,別人不能讀也不能寫。

讀寫鎖的規則,讀讀不互斥,凡是帶寫的操作互斥。讀的時候別人可以讀但不能寫。寫的時候,別人不能讀也不能寫。

這兩種鎖,是實實在在的鎖。

互斥鎖其實很符合悲觀鎖的思想,但二者不能混為一談。畢竟描述角度不一樣,就像老婆做的餅和老婆餅一樣,雖然都叫餅,老婆做的餅是一類餅,老婆餅是特定一種商品。

讀寫鎖跟樂觀鎖更是沒有一毛錢關係。樂觀鎖沒有鎖定任何資料,只是通過對比+重試實現資料不亂套。

互斥鎖 自旋鎖 讀寫鎖 悲觀鎖 樂觀鎖

最底層的兩種就是會 互斥鎖和自旋鎖 有很多高階的鎖都是基於它們實現的,你可以認為它們是各種鎖的地基,所以我們必須清楚它倆之間的區別和應用。加鎖的目的就是保證共享資源在任意時間裡,只有乙個執行緒訪問,這樣就可以避免多執行緒導致共享資料錯亂的問題。當已經有乙個執行緒加鎖後,其他執行緒加鎖則就會失敗,互斥...

作業系統 互斥鎖 自旋鎖 讀寫鎖 悲觀鎖 樂觀鎖

使用場景 如果你能確定被鎖住的 執行時間很長,就不應該用互斥鎖 加鎖的目的就是保證共享資源在任意時間裡,只有乙個執行緒訪問,這樣就可以避免多執行緒導致共享資料錯亂的問題。互斥鎖加鎖失敗後,執行緒會釋放 cpu 給其他執行緒,自身處於獲取鎖阻塞狀態,然後從使用者態切換到核心態由由核心幫助進行切換執行緒...

C 樂觀鎖 悲觀鎖 共享鎖 排它鎖 互斥鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。通過 jdbc 實...