-
1 # 此生唯一
-
2 # 一個存在感小透明
只要是程式設計師,不管是web開發還是軟體開發,只要涉及到資料一致性等方面的操作,都離不開鎖,而鎖也分很多種,在資料庫操作過程中,有樂觀鎖,悲觀鎖等等。下面,我們先對題主的問題進行講解。
互斥鎖當共享的資源是互斥的時候,每當一個物件獲得了資源的使用權的時候,就要對這個資源加鎖,避免再背其他物件獲取。這個時候,其他物件都會陷入阻塞狀態,要等到有使用權的物件釋放鎖之後,才會喚醒目前排在第一位的下一個物件。
這個像很多學生排隊等老師批作業。老師作為唯一資源,被很多物件(學生)需要,但是老師同時只能批改一個學生的隨堂作業,因此當第一個完成作業的同學到講臺上的時候,他就佔用了老師這個資源,相當於上了一個互斥鎖。其他完成作業的同學,必須坐在座位上,等老師喊,“下一個”,才能有機會獲取被老師批改作業的機會。
條件鎖條件鎖使用場景是當某個物件明明已經獲取了某個鎖,但是因為其他條件沒滿足,要繼續等待直到該條件滿足,這個時候就要用到條件鎖。這種情況下,物件會在這個條件上發生阻塞,當其他物件發現這個條件滿足了的時候,就可以喚醒這個物件,讓它去使用資源了。
這個例子就好像學生A和學生B共同出資買了一個遊戲機,他們約定開機密碼A記住前三位,B記住後三位,只有雙方都在的時候才能玩。晚上,A把遊戲機(資源)拿回家,明明已經資源在手,但是由於其他條件不滿足(A不知道後面三位密碼),所以一定要等到B也在的第二天,A才能玩上游戲機。
讀寫鎖讀寫鎖並不是一把鎖,而是兩把,分別是讀鎖,寫鎖。
只有一個物件可以有寫鎖,但是可以多個物件有讀鎖。
當一個物件要修改一個資源資料的時候,就會要對資源上一把寫鎖,這時候,任何人都不能來拿鎖,包括寫鎖和讀鎖。
當一個物件要讀一個資源資料的時候,它就要對資源上一把讀鎖,這個時候,其他人也可以來一起上讀鎖,但是不可以上寫鎖。
舉個例子,假設網路小說作家線上寫作。
當他開始寫作的時候,其他人都看不到他正在寫的文章,等他釋放了寫鎖,即把文章發出去之後,大家都可以來看了(多人拿到讀鎖),但是這個時候,只要還有任何一個讀者在看他釋出的小說,他就不能對這篇小說做修改(讀鎖未釋放,寫鎖不能上)。
自旋鎖這是一個特殊的互斥鎖,當資料被加了鎖之後,其他來想要拿鎖的其他物件不會被陷入休眠阻塞態,而是會輪詢資源狀態,直到資源剛好被釋放。這樣做的好處是能夠減少喚醒物件的消耗, 但是相對來說,卻會消耗CPU的資源。繼續用上面老師批改作業的例子,就是完成了作業小朋友不用在座位上等老師叫了,而是過一會兒就去問老師,“老師你批改完了嗎”,這樣做的好處當然就是一旦老師批改完了當前學生的作業,就會立刻開始批改下一個來問的學生作業,但是壞處自然就是容易把老師給問煩了,說不定批評你(消耗CPU資源)。
回覆列表
學習複雜的技術一定要透過簡單的生活事例去理解,和加深記憶,不然你絕對掌握不了!
鎖用在高併發,多執行緒模型當中,用於解決共享資源的安全問題!防止資料錯誤!
下面分別用事例說下這幾種鎖機制:
1,互斥鎖:也叫阻塞鎖,就像上wc,同一個WC不可能容納兩個人(執行緒)同時進行吧?一個人在上的時候,把門關上了,另一個人只能一直等著,這就是互斥鎖(只有一個能執行)!
2,條件鎖:也叫條件變數鎖,兩個人去酒店吃飯,你去上WC的時候,發現裡面有人(別的執行緒在執行)在上,敲了敲門,裡面的人說:你先再去吃會,等我好了我叫你哈!然後你回去繼續等著!(無競爭),等到他好了叫你了(喚醒執行緒),你才去繼續執行!
3,讀寫鎖:同一個場景,同一個坑位!酒店人太多了,上廁所擠不過來!怎麼辦呢?一塊小便吧(同享同一個坑位,小便,讀鎖共享),但是上大號怎麼辦呢?還是隻能一個人啊(寫鎖還是一個執行緒獨佔)!解決大量的小便阻塞坑位的問題!
4,自旋鎖:還是同一個場景,同一個坑位!一個人已經佔了坑了,但是你很急啊,要拉褲子了,怎麼辦呢?一直敲門(迴圈檢索是否可以獲得鎖),同時說,我好急啊!直到裡面的人不勝其煩出來了,你進去愉快的上廁所(執行執行緒)了!這個過程中你一直在敲門(一直使用CPU資源)!