一、在討論鎖之前,我們需要先看下程序之間的兩種主要關係,同步和互斥。
互斥:是指散步在不同程序之間的若干程式片段,當某個程序執行其中乙個程式片段時,其它程序就不能執行它 們之中的任一程式片段,只能等到該程序執行完這個程式片段後才可以執行。指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
同步:是指散步在不同程序之間的若干程式片斷,它們的執行必須嚴格按照規定的 某種先後次序來執行,這種先後次序依賴於要完成的特定的任務。指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。
二、在這之前,我們先看下什麼是鎖?鎖的種類?以及為什麼我們需要鎖?
鎖:是在解決資源競爭的時候的一種策略,是處理併發的一種同步手段。例如:當多個執行緒、程序或者客戶端在訪問同乙個資源的時候,因為訪問和更改該資源的先後順序的問題,而導致獲取的資訊不一致。而鎖的引入,可以保證該資源的被同乙個使用者使用時,操作結果是一致的。
最常用的鎖,有讀寫鎖和互斥鎖。
讀寫鎖:主要用於多執行緒,解決多執行緒之間的讀寫問題,主要是為了解決併發讀的效能問題,使用該鎖,可以大大提高資料併發訪問的效能,只有在寫時,才會阻塞所有的讀鎖。
讀寫鎖特點:
1)多個讀者可以同時進行讀
2)寫者必須互斥(只允許乙個寫者寫,也不能讀者寫者同時進行)
3)寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)
互斥鎖:lock 關鍵字將語句塊標記為臨界區,方法是獲取給定物件的互斥鎖,執行語句,然後釋放該鎖。當任何乙個執行緒獲取到鎖後,其他執行緒如果需要使用該臨界區內**,則必須等待前乙個執行緒使用完畢後釋放鎖。
互斥鎖特點:xi
一次只能乙個執行緒擁有互斥鎖,其他執行緒只有等待。
三、分布式鎖:
用於分布式系統中,是控制分布式系統之間同步訪問共享資源的一種方式。主要用於解決下面兩個場景:
1.效率:避免不同節點重複相同的工作。如果乙個動作只需要乙個節點處理,那我們要避免這個動作被多個節點都進行操作。
2.正確性:如果乙個資料會被不同的節點使用,而這個資料的操作受不同節點的操作影響,那麼我們需要分布式鎖來保證操作的正確性。
分布式鎖需要具備的特性:
1.互斥性,這個與非分布式鎖並無明顯區別,需要保證單個節點之間的互斥性。
2.可重入性:同乙個人節點的同乙個執行緒獲取到這個鎖之後,
該執行緒還是可以繼續獲取該鎖。
3.鎖超時機制:因為分布式節點往往分布在不同的機器上,
所以我們需要超時機制來保證,鎖不能一致被釋放。
4.高效性:不能因為鎖的緣故,導致分布式系統,卡在這一步。
分布式鎖的作用及實現(redis)
聊聊高併發(三)鎖的一些基本概念
維基百科:讀寫鎖
再有人問你分布式鎖,這篇文章扔給他
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
Redis分布式集群 基礎知識 1
redis如今已經成為web開發社群中最火熱的記憶體資料庫之一,而它的誕生但現在不過才4年。點此檢視redis中文官方文件 redis是乙個開源的高效能鍵值key value對資料庫,它通過提供多種鍵值資料庫型別來適應不同場景下的儲存需求,並借助許多高層級的介面使其可以勝任如快取 佇列系統等不同的角...
分布式系統詳解 基礎知識(概論)
由於網上介紹的分布式的系統講解並沒有多少,所以在這兒就希望可以寫一套系統的分布式的詳解,未來也結合springboot的搭建分布式系統進行詳細構建。也願意堅持寫下去,寫給自己也分享給大家,希望大家可以提出寶貴的意見,一同長進。哈哈。第一篇文章,開個頭。了解起來分布式呢,順便也介紹一下集群,這兩個概念...